设为首页 收藏本站
查看: 882|回复: 0

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

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-6-6 10:55:14 | 显示全部楼层 |阅读模式
摘要: hdfs包是hadoop HDFS的主要实现,首先分析下协议包,这个包定义了hdfs在不同节点中的通信协议,对于协议的分析有助于后面的章节对于hdfs服务端、客户端通信的深入理解,按照惯例,首先看一下这个包中几个孤立的类: ...

hdfs包是hadoop HDFS的主要实现,首先分析下协议包,这个包定义了hdfs在不同节点中的通信协议,对于协议的分析有助于后面的章节对于hdfs服务端、客户端通信的深入理解,按照惯例,首先看一下这个包中几个孤立的类:
113412r66fzfex5hqx7eiw.png
DataTransferProtocol接口:这个接口定义了客户端和datanode传输数据所采用的流协议,包含如下属性:
113412rsszazp4ds4dsdal.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数组


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


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

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


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

BlockMetaDataInfo继承了Block类,增加了lastScanTime属性,记录上次扫描的时间
NamespaceInfo类继承了StorageInfo类,除了记录基本的存储信息外还记录了build版本信息和更新的版本信息
InterDatanodeProtocol接口继承了带版本的协议接口,可以用新的标示和长度来更新数据块
DisallowedDatanodeException:datanode和namenode失去联系抛出的异常
NamenodeProtocol接口继承了带版本的协议接口,这个协议是namenode和secondary之间通信用的,提供了对EditLog和FsImage操作的方法
BlocksWithLocations提供了对于BlockLocations更为高效的序列化和反序列化的方法
DatanodeRegistration类提供了对datanode进行标示和验证的在namenode上所有的信息
DatanodeProtocol提供了datanode和namenode交互的协议
113414sqwgg41n6qu5ngg6.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:提交块同步



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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-20264-1-1.html 上篇帖子: hadoop源码分析系列(三)——org.apache.hadoop.fs包 ----(下) 下篇帖子: hadoop源码分析系列(五)——org.apache.hadoop.hdfs包之balancer篇
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表