HDFS的心跳机制学习

  • Post author:
  • Post category:其他




HDFS的心跳机制学习

在HDFS的主/从架构中,NameNode 是主服务器,负责管理整个集群中的

DataNode,DataNode 是从服务器,负责执行任务。HDFS 中的通讯协议都是构建在 TCP/IP 协议之上,DataNode 使用 Datanode Protocol 接口与 NameNode 交互,而 Datanode Protocol 又是基于远程过程调用(RPC)之上的,这个 NameNode 与 DataNode 通信的过程就是 HDFS 的心跳机制。DataNode 通过心跳机制与 NameNode 保持通信, DataNode 周期性 (默认心跳间隔是3 s)地向 NameNode 发送心跳包信息,若 NameNode 在设置的时间阈值 (心跳间隔 )过后还没有检测到 DataNode 发来的心跳包信息,则 NameNode 认为该 DataNode 已经失效。DataNode与NameNode间的心跳机制如图1所示。

图1 心跳机制原理图

在这里插入图1图片描述

在 HDFS 集群启动后,集群中 DataNode 会主动向 NameNode 发送心跳包注册信息,注册信息中包括 DataNode 的名字、总容量、已用容量、剩余容量、数据传输端口等信息。注册完成后,DataNode 节点便每隔 3 秒钟向 NameNode 节点发送一次心跳信息,这个 3 秒钟的时间间隔是缺省值,可以通过修改hdfs-site.xml 配置文件中的 dfs.heartbeat.interval 属性值来修改心跳间隔时间。DataNode 类负责心跳信息的发送和来自 NameNode 执行指令的接收,通过分析 DataNode 类的源代码可知,在

DataNode 类中的 while 循环中调用 sentHeartbeat( ) 方法完成心跳信息的发送,这个 while 循环从 DataNode 服务器启动后开始运行,直到 HDFS

集群关闭或者 DataNode 节点失效时停止。关键代码如下所示:

while (should Run) {


try {


long start Time = now( );

if (startTime – lastHeartbeat > heartBeatInterval) {


last Heartbeat = startTime;

Datanode Command[ ] cmds =

namenode.send Heartbeat(dn Registration,

data.getCapacity( ),

data.getDfsUsed( ),

data.getRemaining( ),

xmitsInProgress.get( ),

getXceiverCount( ));



}

}

}

NameNode 接收到心跳包信息后,会调用 FSNamesystem 类的 handleHeartbeat( ) 方法处理心跳包信息,NameNode完成对心跳包的处理后, 会将DataNode 要进行的操作指令封装到DatanodeCommand 数组中作为 handleHeartbeat( )方法的返回值返回给 DataNode,如果不需要 DataNode 进行任何操作,则不会返回任何信息,此时 DataNode 也不会执行任何操作,然后等待 NameNode 发来的下一个指令集。

(声明:以上内容均为本人参考他人论文的内容,仅供自己学习记录使用,请勿用作商业用途。)



版权声明:本文为qq_41257653原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。