1、流程
代碼編寫 =》 作業配置 =》 作業提交 =》 Map任務的分配和執行 =》 處理中間結果 =》 Reduce任務的分配和執行 =》 作業完成
在每個任務的執行過程中,又包含輸入準備 =》 任務執行 =》 輸出結果
MapReduce作業的執行可以分爲11個步驟,涉及4個獨立的實體:
客戶端(client):編寫MapReduce代碼,配置作業、提交作業。
JobTracker:初始化作業,分配作業,與TaskTracker通信、協調整個作業的執行
TaskTracker:保持JobTracker的通信,在分配的數據片段上執行Map或Reduce任務。
HDFS:保存作業的數據、配置信息等,保存作業結果。
2、作業提交
一個MapReduce作業在提交到hadoop上之後,會進入完全的自動化執行過程。在這個過程中,用戶除了監控程序的執行和強制中止作業之外,不能對作業的執行過程進行任何干擾。所以,在作業提交之前,用戶需要將所有應該配置的參數按照自己的意願配置完畢。需要配置的主要參數如下:
程序代碼、Map和Reduce接口的配置、輸入/輸出路徑、其他類型設置
整個提交過程包含以下步驟:
(1) 通過調用JobTracker對象的getNewJobId()從JobTracker處獲取當前作業的id號
(2) 檢查作業相關路徑。
(3) 計算作業的輸入劃分,並將劃分信息寫入Job.split文件,如果寫入失敗就會返回錯誤。
(4) 將運行作業所需要的資源—包括作業JAR文件、配置文件和計算所得的輸入劃分等—複製到作業對應的HDFS上。
(5) 調用JobTracker對象的submit()方法來真正提交作業,告訴JobTracker作業準備執行。
3、初始化作業
在客戶端用戶作業調用JobTracker對象的submitJob()方法後,JobTracker會把此調用放入內部的taskScheduler變量中,然後進行調試。
初始化過程主要有以下步驟:
(1) 從HDFS中讀取作業對應的job.split。
(2) 創建並初始化Map任務和Reduce任務。
(3) 最後就是創建兩個初始化任務,根據Map和Reduce個數及輸入分片中已經配置的信息,分別初始化Map和Reduce
4、分配任務
TaskTracker和JobTracker之間通過心跳通信匯報狀態和分配任務。TaskTracker首先發送自己的狀態(主要是Map任務和Reduce任務的個數是否小於上限),並根據自己的條件選擇是否向JobTracker請求新的任務,最後發送心跳。JobTracker接收到TaskTracker的心跳後首先分析心跳信息,如果發現TaskTracker在請求一個新任務,那麼任務調試器就會將任務和任務信息封裝起來返回給TaskTracker。
針對Map任務和Reduce任務,TaskTracker有固定數量的任務槽(Map任務和Reduce任務的個數都有上限)。當TaskTracker從JobTracker返回的心跳信息中獲取新的任務信息時,會將Map任務或者Reduce任務加入對應的任務槽中。需要注意的是,在JobTracker爲TaskTracker分配Map任務時,爲了減小網絡帶寬會考慮將Map任務數據本地化。它會根據TaskTracker的網絡位置,選取距離最近的輸入劃分文件分配給些TaskTracker。最好情況是,劃分文件就在TaskTracker本地。
5、執行任務
在TaskTracker申請到新的任務之後,就要在本地運行任務了。通過調用localizeJob()方法來完成本地化。
(1) 將job.split複製到本地。
(2) 將job.jar複製到本地。
(3) 將job的配置信息定稿job.xml
(4) 創建本地任務目錄,解壓job.jar
(5) 調用launchTaskForJob()方法發佈任務。
本地化後,調用launchTaskForJob()真正啓動起來,調用launchTask()方法啓動任務。launchTask()方法先會爲任務創建本地目錄,然後啓動TaskRunner,在啓動TaskRunner後,對於Map任務,會啓動MapTaskRunner;對於Reduce任務則啓動ReduceTaskRunner。
6、更新任務執行進度和狀態
TaskTracker每隔5s發送給JobTracker的心跳中封裝任務狀態,報告自己的任務執行狀態。通過心跳通信機制,所有TaskTracker的統計信息都會彙總到JobTracker處。JobTracker將這些統計信息合併起來,產生一個全局作業進度統計信息,表明正在運行的所有作業及其中所含任務的狀態。最後,JobClient通過每秒查看JobTracker來接收作業進度的最新狀態。
7、完成作業
所有TaskTracker任務的執行進度信息都會彙總到JobTracker處,當JobTracker接收到最後一個任務已完成的通知後,便把作業的狀態設置爲“成功”。然後,JobClient也將及時得知任務已成功完成,它便會顯示一條信息告知用戶,最後從runJob()方法處返回(在返回後,JobTracker會清空作業的工作狀態,並指示TaskTracker也清空作業的工作狀態,如刪除中間輸出等)。