hadoop heartbeat分析

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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章