0%

DataNode 心跳机制

DataNode 心跳机制的作用


作用

DataNode 心跳机制的作用

  • register: 当DataNode启动的时候,DataNode需要将自身的一些信息(hostname, version等)告诉NameNode,NameNode经过check后使其成为集群中的一员,然后信息维护在NetworkTopology中
  • block report: 将block的信息汇报给NameNode,使得NameNode可以维护数据块和数据节点之间的映射关系
  • 定期的send heartbeat
    • 告诉NameNode我还活着,我的存储空间还有多少等信息
    • 执行NameNode通过heartbeat传过来的指令,比如删除数据块

以上第1和第2个动作都是在DataNode启动的时候发生的,register的步骤主要功能是使得这个DataNode成为HDFS集群中的成员,DataNode注册成功后,DataNode会将它管理的所有的数据块信息,通过blockReport方法上报到NameNode,帮助NameNode建立HDFS文件数据块到DataNode的映射关系,这一步操作完成后,DataNode才正式算启动完成,可以对外提供服务了。

由于NameNode和DataNode之间存在主从关系,DataNode需要每隔3s发送心跳到NameNode,如果NameNode长时间收不到DataNode节点的心跳信息,那么NameNode会认为DataNode已经失效。NameNode如果有一些需要DataNode配合的动作,则会通过心跳返回给DataNode,心跳返回值是一个DataNodeCommand数组,它是一系列NameNode的指令,这样DataNode就可以根据指令完成指定的动作,比如HDFS文件的删除。

心跳间隔默认3s, 可以在 hdfs-default.xml 配置文件中修改

1
2
3
4
5
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
<description>Determines datanode heartbeat interval in seconds.</description>
</property>

应用

DN 宕机

如何知道 DataNode 已经死掉?

通过心跳机制来判断死亡,如果 DN 默认3s时间间隔没有给namenode发送心跳,NN 并不会直接断定 DN 死了。
NN 会给 DN 为10次的机会,如果 DN 在30秒的时间还没有向 NN 发送心跳,NN 就暂时的,记住是暂时的认为 DN 死亡了。
于是 NN 就会每隔5分钟向 DN 发送一次检查,如果发送了两次依旧还没有收到 DN 的消息,那么 NN 就判定这个 DN 节点挂掉了。

HDFS 默认的超时时间为 10分钟+30秒

计算公式为:
timeout = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval

默认的heartbeat.recheck.interval大小为5000毫秒,即5分钟,dfs.heartbeat.interval默认的大小为3秒

1
2
3
4
<property>
<name>heartbeat.recheck.interval</name>
<value>5000</value>
</property>
文件删除

流程图其实也是很简单,步骤如下

  1. 客户端创建一个FileSystem实例
  2. 调用FileSystem的delete方法,这个时候会向NameNode发起删除文件的请求,这个时候在NameNode中会删除对应的文件的元数据,并将这个文件标记为删除,但是这个文件对应的数据块并不会删除
  3. 当需要删除的文件对应的数据块所在的DataNode向NaneNode发了心跳后,NameNode将需要删除这个文件对应数据块的指令通过心跳返回给DataNode,DataNode收到指令后才会真正的删除数据块

参考链接