MapReduce的處理流程(一)

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也清空作業的工作狀態,如刪除中間輸出等)。

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