HDFS源码解析(1)-heartbeat

Posted by AlstonWilliams on February 17, 2019

heartbeat是HDFS中最重要的RPC中的一个,DataNode通过heartbeat告诉NameNode的关于DataNode的存活状态,以及DataNode的一些信息,比如,有多少可用存储空间。

然后,NameNode会给DataNode发送一些Command,基于NameNode上为各个NameNode维护的一些信息,比如有哪些block要被删除等。

大致上NameNode和DataNode之间的heartbeat的过程如下:

DataNode通过Heartbeat发送给NameNode的信息包括这么一些:

  • DatanodeRegistration:NameNode用它来验证DataNode
  • xceiverCount:此DataNode中用于接受Client请求以及其他DataNode请求的线程的数量
  • xmitsInProgress:此DataNode中用于向其他DataNode发送数据的线程的数量
  • failedVolumes:此DataNode上失败的Volume的数量
  • StorageReport: 各个Storage的信息
  • cacheCapacity:此DataNode上可用的Cache的容量
  • cacheUsed:此DataNode上已用的Cache的容量

如下图所示:

然后,NameNode最终会调用DatanodeManager.handleHeatbeat()来处理heartbeat。

关于这个方法的处理过程,在上面的流程图中已经写的非常详细了,主要就是做这么四件事:

  • 如果这个DataNode没有注册过,那么就回复给DataNode一条RegisterCommand提醒它注册
  • 如果NameNode此时处于safe mode中,那么就发送一条空的Datanode Command
  • 如果检测到需要lease recovery,那么就发送一条BlockRecoveryCommand
  • 否则的话,就把跟这个DataNode对应的要传输block,以及要删除的block,要缓存的以及取消缓存的block等,通过对应的Command发送给DataNode

这里第三点以及第四点都是蛮重要也蛮复杂的部分,我们会在后面的文章中详细介绍。

在DataNode收到NameNode发送过来的Command之后,就会做相应的处理,对应的代码如下:

同时,在DataNode中,还会根据对应的处理结果,来决定是否进行block report以及cache report等。

heartbeat的实现,本身并不复杂,复杂的是NameNode收到heartbeat后对应的处理,如lease recovery等。