注册
在HDFS - HDFS的四个角色提到了NameNode启动的时候,会开启RPC服务,叫做ServiceRpcServer,这个Server有很多个协议,其中一个叫做DatanodeProtocol协议,用来响应DataNode的请求,比如注册、心跳、block报文处理等。
DataNode启动的时候,会根据NameNode的地址,把自己的IP地址、端口、主机名等信息,发送给NameNode进行注册,为了使注册成功,DataNode会一直重试,直至成功。
NameNode接收到请求后,他会验证一下自己是否已经启动完成,如果已经成功就把DataNode的信息加入到内存DatanodeManager.datanodeMap完成注册,并且加到HeartbeatManager.datanodes,HeartbeatManager主要是用于管理心跳的。这些都完成后,就会判断是否进入安全模式,安全模式上章节已经讲了。
心跳
注册成功后,DataNode每隔三秒中就会给NameNode发送心跳。
NameNode接收到心跳请求后,也会先判断自己是否已经启动。
由于注册的时候,会把DataNode的信息保存在DatanodeManager.datanodeMap中,所以发送心跳的时候,会先验证是否在这个内存中,如果不在,说明没有注册过。
如果已经注册过,会通过HeartbeatManager更新最后一次的心跳时间。
我们注意到,每次心跳NameNode都会返回一些指令,在Hadoop中,NameNode并没有发送指令给DataNode,需要通过DataNode发送心跳后,返回指令给DataNode。
剔除
当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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。