HDFS - NameNode如何感知到DataNode的

注册

HDFS - HDFS的四个角色提到了NameNode启动的时候,会开启RPC服务,叫作ServiceRpcServer,这个Server有不少个协议,其中一个叫作DatanodeProtocol协议,用来响应DataNode的请求,好比注册、心跳、block报文处理等。
image.png
DataNode启动的时候,会根据NameNode的地址,把本身的IP地址、端口、主机名等信息,发送给NameNode进行注册,为了使注册成功,DataNode会一直重试,直至成功。
image.png
NameNode接收到请求后,他会验证一下本身是否已经启动完成,若是已经成功就把DataNode的信息加入到内存DatanodeManager.datanodeMap完成注册,而且加到HeartbeatManager.datanodes,HeartbeatManager主要是用于管理心跳的。这些都完成后,就会判断是否进入安全模式,安全模式上章节已经讲了。
image.pngnode

心跳

注册成功后,DataNode每隔三秒中就会给NameNode发送心跳。
NameNode接收到心跳请求后,也会先判断本身是否已经启动。
因为注册的时候,会把DataNode的信息保存在DatanodeManager.datanodeMap中,因此发送心跳的时候,会先验证是否在这个内存中,若是不在,说明没有注册过。
若是已经注册过,会经过HeartbeatManager更新最后一次的心跳时间。
咱们注意到,每次心跳NameNode都会返回一些指令,在Hadoop中,NameNode并无发送指令给DataNode,须要经过DataNode发送心跳后,返回指令给DataNode。
image.pngsegmentfault

剔除

当NameNode发现一个DataNode已经长时间没有发送心跳信息了,就会把他剔除下线。
HeartbeatManager中有一个线程,默认每5分钟会检查一次,这个时间由dfs.namenode.heartbeat.recheck-interval设置的。
HeartbeatManager检查的时候,会遍历全部的datanodes,判断每一个datanode是否已经死亡,若是已经死亡,就把他从内存中删除掉。剔除掉后,就会判断是否进入安全模式。
判断是否死亡的时间是由下面的公式计算的,heartbeatRecheckInterval 默认5福州,heartbeatIntervalSeconds就是心跳的时间,默认3秒,因此就是10分钟+30秒,也就是说,DataNode在630秒后仍是没有发送心跳信息,NameNode就看成他已经死亡了,而且从内存中剔除。安全

2 heartbeatRecheckInterval + 10 1000 * heartbeatIntervalSeconds

image.png

相关文章
相关标签/搜索