基於 Hadoop 1.x (MRv1) 架構,分析 JobTracker 與 TaskTracker 交互核心流程:Job 提交 → 初始化 → TaskTracker 心跳 → 任務調度分配。
JobQueueTaskScheduler,實現任務分配邏輯。JobInProgress 加入 jobs 集合。JobQueueJobInProgressListener 將 JIP 放入 jobQueue (Map<JobSchedulingInfo, JIP>)。EagerTaskInitializationListener 將 JIP 放入 jobInitQueue,按優先級/提交時間排序,喚醒 JobInitManager 線程。JobInitManager 從佇列取出 JIP,提交 InitJob 至線程池執行 JIP.initTasks()。numMapTasks 一致。TaskInProgress 陣列,放入 nonRunningMapCache (Map<Node, List<TIP>>) 實現資料本地性。nonRunningReduces。completedMapsForReduceSlowstart(預設 5% Map 完成才啟動 Reduce)。tasksInited = true,記錄 JobHistory。參數:TaskTrackerStatus、restarted、initialContact、acceptNewTasks、responseId。
acceptTaskTracker,檢查 include/exclude 清單)。responseId 未變則重發上次回應。processHeartbeat 更新 Tracker 狀態、Task 狀態、節點健康度。HeartbeatResponse:public List<Task> assignTasks(TaskTracker tracker)
{
// 1. 計算集群/Tracker 級 Map/Reduce 容量與負載因子
// 2. 分配 Map Task:優先 Node-local → Rack-local → Off-switch
// 從 failedMaps、nonRunningMapCache、nonLocalMaps、speculative 依序嘗試
// 3. 分配 Reduce Task:每次心跳最多 1 個,檢查 Map 完成比例
// 4. 預留槽位 (exceededPadding) 給高優先級/失敗重試任務
// 5. 返回 Task 列表 (MapTask/ReduceTask 實例)
}
failedMaps 中找未在該 Tracker 執行過的 TIP。nonRunningMapCache[trackerNode]。parent Node。maxCacheLevel 限制)。nonLocalMaps (計算密集型,無輸入資料)。runningMapCache 中緩慢的 TIP。nonRunningReduces 取一個。runningReduces 中緩慢的。LaunchTaskAction 加入 actions。trackerToHeartbeatResponseMap。removeMarkedTasks。org.apache.hadoop.mapred.JobTrackerorg.apache.hadoop.mapred.TaskTrackerorg.apache.hadoop.mapred.JobInProgressorg.apache.hadoop.mapred.TaskInProgressorg.apache.hadoop.mapred.JobQueueTaskSchedulerorg.apache.hadoop.mapred.EagerTaskInitializationListener