1. Data node -> name node heart beat
datanode 發起heart beat,週期性的向name node發送。heart beat間隔通過 dfs.heartbeat.interval 進行設置。
在data node中的主循環 offerService()發起heart beat: 主要包含以下信息:
DatanodeCommand[] cmds = namenode.sendHeartbeat(dnRegistration, // DatanodeRegistration
data.getCapacity(), // data node的容量
data.getDfsUsed(), // data node已用空間
data.getRemaining(), // data node剩餘空間
xmitsInProgress, // 傳輸的block數
getXceiverCount()); // data node xceiver 的數目
DatanodeRegistration包括了namenode用來標識個驗證data node的全部信息。
heart beat 通過rpc,調用 Namenode的同名方法。Namenode 類會調用FSNamesystem 中handleHeartbeat完成heart beat的處理工作。
在handleHeartbeat 中,處理過程主要有以下幾步:
1. namenode 中維護了一個datanode -> block map.的映射關係(對應於數據結構爲 StorageID -> DatanodeDescriptor), 當namenode收到一個heart beat request 後,在該map中查找對應data node是否存在,如果不存在,則返回data node command DatanodeCommand.REGISTER.
2. 檢測 data node 是否應該被shut down, (即:如果該節點被置爲 DECOMMISSIONED, 則其應該被shut down)。如果該data node應該被shut down,則namenode會通過rpc 將DisallowedDatanodeException 丟回給對應data node, data node收到該exception後,自殺。
3. 更新 StorageID -> DatanodeDescriptor 表 (datanodeMap) 中DatanodeDescriptor相關信息
4. 檢查lease recovery
5. 檢查處於pending 狀態的 replication
6. 檢查非法塊
7. 檢查是否需要升級
2. task tracker -> job tracker heart beat
同dn -> nn 的heartbeat相似。 tt -> jt的heartbeat是由tt發起的,由tt中offerService() 週期性的調用transmitHeartBeat (),向jt發送心跳包。heart beat主要包括以下信息:
HeartbeatResponse heartbeatResponse = jobClient.heartbeat(status, // TaskTrackerStatus
justStarted, // tt是否爲剛啓動
askForNewTask, // tt是否向jt要新的task
heartbeatResponseId); // 上次心跳response 的id
參數TaskTrackerStatus 包含了一個tt詳細的信息,包括其上運行的全部task的狀態(TaskTrackerStatus),host, tracker name,maxReduceTasks, maxMapTasks,ResourceStatus (tt的資源使用狀況).
heart beat 通過InterTrackerProtocol 發送到jt, 由jt進行下面的工作。
1.檢查tt是否爲被允許節點(即:是否在slave列表中且不再exclude 列表中)
2. jt中維護這trackerID --> last sent HeartBeatResponse的映射關係,取該tt上次heart beat的response.
如果tt不是初始連接,如果jt中上次 heart beat resp爲空,則表示 jt出現了嚴重的問題,現在的實現中,會記錄一個warning,然後new一個新的resp。
3.調用processHeartbeat(), 即根據此次heart beat中所包含的tt 和 task的信息,更新jt中相應的數據結構
4.初始化 jt返回的response 對象
5.檢測將在該 tasktracker上運行的新task
6.檢測需要被kill的task
7.檢測需要被kill或者cleanup的job
8.更新jt中的 trackerToHeartbeatResponseMap結構
9.處理完 hearbeat, 刪除該tt上全部 'marked' tasks。