hadoop源码分析系列(四)——org.apache.hadoop.hdfs包之协议篇

摘要: hdfs包是hadoop HDFS的主要实现,首先分析下协议包,这个包定义了hdfs在不同节点中的通信协议,对于协议的分析有助于后面的章节对于hdfs服务端、客户端通信的深入理解,按照惯例,首先看一下这个包中几个孤立的类: ...
hdfs包是hadoop HDFS的主要实现,首先分析下协议包,这个包定义了hdfs在不同节点中的通信协议,对于协议的分析有助于后面的章节对于hdfs服务端、客户端通信的深入理解,按照惯例,首先看一下这个包中几个孤立的类:
1.png
DataTransferProtocol接口:这个接口定义了客户端和datanode传输数据所采用的流协议,包含如下属性:
2.png
特殊的说明下面几个:
OP_REPLACE_BLOCK从balancer节点发出到目标节点,包含了block id, 来源和 proxy的信息,OP_COPY_BLOCK从目的节点发送到proxy,只包含block id,对OP_COPY_BLOCK的回应要发送block内容,对OP_REPLACE_BLOCK的回应是要包括操作状态的信息,HEARTBEAT_SEQNO是心跳报文的序列号。剩下的常量从名字就可以得到具体意义了。
接口中的静态内部类PipelineAck对报文的返回做了初步解析,例如对心跳报文的解析,对返回状态的初步判断等等。

ClientDatanodeProtocol接口主要定义了用于数据块恢复的方法recoverBlock。

FSConstants主要定义了常量

AlreadyBeingCreatedException异常类定义了创建正在创建的文件时的异常

ClientProtocol接口定义了用户代码和namenode之前的交互,这个接口的方法将做详细分析,这也是api操作hdfs的基础方法:
getBlockLocations(String src, long offset,long length):获得指定的文件偏移块所在的datanode列表,按照和客户端距离排序

create(String src, FsPermission masked,String clientName, boolean overwrite,
short replication,long blockSize ):在namespace上创建一个新的文件实体,一旦创建了,这个文件对其他的client就可见了,还可以通过addBlock方法添加多个块。
append(String src, String clientName):在尾部追加文件
setReplication(String src, short replication) :对指定存在的文件设置冗余

setPermission(String src, FsPermission permission):对存在的文件设置权限
abandonBlock(Block b, String src, String holder):丢弃一个块
addBlock(String src, String clientName):追加块
complete(String src, String clientName):写块是否完成
reportBadBlocks(LocatedBlock[] blocks):报告坏块
rename(String src, String dst):重命名块
delete(String src):从fs上删除块
delete(String src, boolean recursive):递归删除
mkdirs(String src, FsPermission masked) :创建指定权限和名称的目录
getListing(String src) :获得指定目录下的文件列表
getStats():获得fs的统计信息
getDatanodeReport(FSConstants.DatanodeReportType type):返回此时datanodes的信息
getPreferredBlockSize(String filename):返回指定文件的块的大小
setSafeMode(FSConstants.SafeModeAction action):设置安全模式
saveNamespace():保存当前的namespace信息并重置edit log
metaSave(String filename):dump namenode的信息到指定文件
fsync(String src, String client):把指定的文件的元数据信息写到存储上

UnregisteredDatanodeException类定义了没有注册的DataNode发生的异常信息

BlockListAsLongs类的作用就是把块数组直接转换为一个long数组


下面是一个异常体系:
3.png
首先理解下quota:一个目录的quota可能是磁盘quota,也可能是namespace的quota
QuotaExceededException类说明了目录实际的quota和规定的quota发生了冲突
NSQuotaExceededException类就是指namespace中目录实际的quota和规定的quota发生了冲突
DSQuotaExceededException类就是指disk space中目录实际的quota和规定的quota发生了冲突


协议部分最后一个类层次关系:
4.png
DatanodeID类用主机、端口、存储id唯一标示了一个datanode,其中端口信息包括了info server端口和ipc server端口
Block类是hdfs特有的存储结构,用一个long类型来标示,名字以blk_为前缀,有id、长度和时间戳标示
LocatedBlock类顾名思义就是已分配空间,或者是已存储在namenode上的块,信息包括block的信息和DatanodeInfo[]
LocatedBlocks记录了文件长度、已分配的块列表和是否正在分配
DatanodeInfo类,在Datanode Protocol 和  Client Protocol中代表一个DataNode的状态信息,
这个类主要分析下属性:

5.png
AdminStates {NORMAL, 正常态 DECOMMISSION_INPROGRESS, 正在退役 DECOMMISSIONED;已经退役 }
capacity:数据结点的总容量
dfsUsed:已经使用的空间
remaining:未使用的空间
lastUpdate:最后的更新时间
xceiverCount:和该结点相连的活动的连接数量
location:默认机架
hostName:DataNode注册时的主机名
level:在node tree中的级别
parent:父节点


下面分析server.protocol自包中的协议
6.png

BlockMetaDataInfo继承了Block类,增加了lastScanTime属性,记录上次扫描的时间
NamespaceInfo类继承了StorageInfo类,除了记录基本的存储信息外还记录了build版本信息和更新的版本信息
InterDatanodeProtocol接口继承了带版本的协议接口,可以用新的标示和长度来更新数据块
DisallowedDatanodeException:datanode和namenode失去联系抛出的异常
NamenodeProtocol接口继承了带版本的协议接口,这个协议是namenode和secondary之间通信用的,提供了对EditLog和FsImage操作的方法
BlocksWithLocations提供了对于BlockLocations更为高效的序列化和反序列化的方法
DatanodeRegistration类提供了对datanode进行标示和验证的在namenode上所有的信息
DatanodeProtocol提供了datanode和namenode交互的协议
7.png
NOTIFY、DISK_ERROR、INVALID_BLOCK定义了三个错误码
DNA_UNKNOWN:不被识别的操作
DNA_TRANSFER:数据块复制操作
DNA_INVALIDATE:删除数据块
DNA_SHUTDOWN:关闭节点
DNA_REGISTER:重新注册
DNA_FINALIZE:回收之前的升级
DNA_RECOVERBLOCK:需要块恢复
主要的方法:
register(DatanodeRegistration registration):注册datanode
sendHeartbeat(DatanodeRegistration registration,long capacity,long dfsUsed, long remaining,int xmitsInProgress,int xceiverCount)发送心跳报文告诉namenode,datanode还活着,同时允许namenode在心跳报文中返回要执行的命令列表
blockReport(DatanodeRegistration registration,long[] blocks):告诉namenode节点中块情况
blockReceived(DatanodeRegistration registration,Block blocks[],String[] delHints) :告诉namenode最近收到的块信息,同时可以删除些冗余过量的块
errorReport():报告错误
commitBlockSynchronization:提交块同步



8.png
DatanodeCommand标示datanode执行的命令:注册、升级
BlockCommand:块命令 主要是给别的datanode发送块
UpgradeCommand:升级命令 执行升级有关的命令如开始升级、升级的状态等

原创作品 转载请标明出处 http://f.dataguru.cn/thread-19209-1-1.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值