05. HDFS RPC接口之InterDatanodeProtocol和NamenodeProtocol

InterDatanodeProtocol

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


05. HDFS RPC接口之InterDatanodeProtocol和NamenodeProtocol
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之间的接口,具有的方法如下图所示


05. HDFS RPC接口之InterDatanodeProtocol和NamenodeProtocol
5. NameNodeProtocol方法.png

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