05. HDFS RPC接口之InterDatanodeProtocol和NamenodeProtocol

InterDatanodeProtocol

InterDatanodeProtocol是Datanode与Datanode之间的接口,主要用于租约恢复操作,具有的方法如下图所示


13274599-fabf25cb16736942.png
4. InterDatanodeProtocol方法.png

只有initReplicaRecovery()和updateReplicaUnderRecovery()两个方法。

客户端打开一个文件进行写操作时,首先要获取这个文件的租约,并且还需要定期更新租约。当Namenode的租约监控线程发现某个HDFS文件租约长时间没有更新时,就会认为写这个文件的客户端发生异常,这时Namenode就需要触发租约恢复操作--同步数据流管道中所有Datanode上该文件数据块的状态,并强制关闭这个文件。

租约恢复操作的控制并不是由Namenode负责的,而是Namenode从数据流管道中选出一个主恢复节点,然后通过下发DatanodeCommand的恢复指令触发这个数据节点控制租约恢复操作,也就是由这个主恢复节点协调整个租约恢复操作的过程。主恢复节点会调用InterDatanodeProtocol接口来指挥数据流管道的其他数据节点进行租约恢复。租约恢复操作其实很简单,就是讲数据流管道中所有Datanode上保存的同一个数据块状态(时间戳和数据块长度)保持一致。当成功完成租约恢复后,主恢复节点会调用DatanodeProtocol.commitBlockSynchronization()方法同步Namenode上该数据块的时间戳和数据块长度,保持Namenode和Datanode一致。

由于数据流管道中同一个数据块状态(时间戳和长度)在不同的Datanode上可能不一致,所以主恢复节点会首先调用InterDatanodeProtocol.initReplicaRecovery()方法获取数据流管道中所有数据节点上保存的指定数据块的状态,这里的数据库状态使用ReplicaRecoveryInfo类封装。主恢复节点会根据收集到的这些状态,确定一个当前数据块的新长度,并且使用Namenode下发的recoverId作为数据块的新时间戳

主恢复节点计算出数据块的新长度后,就会调用InterDatanodeProtocol.updateReplicaUnderRecovery()方法将数据流管道中所有节点上该数据块的长度同步为新的长度,将数据块的时间戳同步为新的时间戳。

当完成了所有的同步操作后,主恢复节点就可以调用将DatanodeProtocol.commitBlockSynchronization()方法将Namenode上该数据块的长度和时间戳同步为新的长度和时间戳,这样Datanode和Namenode的数据也就一致了

NamenodeProtocol

NamenodeProtocol定义了Second Namenode与Namenode之间的接口,具有的方法如下图所示


13274599-1ccf65a41fdcee0a.png
5. NameNodeProtocol方法.png

在Hadoop 2.X架构中Second Namenode的功能已经完全被Standby Namenode节点取代,这个接口中的方法也就不介绍了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值