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

相關文章
相關標籤/搜索