第九篇:Map/Reduce 工作機制分析 - 作業的執行流程

穆晨發表於2017-05-20

前言

       從執行我們的 Map/Reduce 程式,到結果的提交,Hadoop 平臺其實做了很多事情。

       那麼 Hadoop 平臺到底做了什麼事情,讓 Map/Reduce 程式可以如此 "輕易" 地實現分散式執行?

Map/Reduce 任務執行總流程

       經過之前的學習,我們已經知道一個 Map/Reduce 作業的總流程為:

       程式碼編寫  -->  作業配置  -->  作業提交  -->  Map任務的分配和執行  -->  處理中間結果(Shuffle)  -->  Reduce任務的分配和執行  -->  作業完成

       如下圖所示:

  

Map/Reduce 框架中的四大實體

1. 客戶端

       負責編寫程式碼,配置作業,提交作業。任何節點都可以充當客戶端。

2. JobTracker (1個)

       作業中心控制節點,一般一個叢集就一個JobTracker。

  3. TaskTracker (很多個)

       作業具體執行節點,可以分為Map節點和Reduce節點兩大類。

4. HDFS

       分散式檔案系統,儲存從作業提交到完成需要的各種資訊。

階段一:提交作業階段

1. 首先,開發人員編寫好程式程式碼,配置好輸入輸出路徑,Key/Value 型別等等。(這部分是人為控制階段,接下來的所有操作都是Hadoop完成的了)

2. 從JobTracker處獲取當前的作業ID號

3. 檢查配置合法性 (如輸入目錄是否存在等)

4. 計算作業的輸入劃分,並將劃分資訊寫入到Job.split檔案。

5. 將執行作業需要的所有資源都複製到HDFS上。

6. 通知JobTracker準備完畢,可以執行作業了。

階段二:初始化作業階段

       這個階段,JobTracker將為作業建立一個物件,專門監控它的執行。

       並根據Job.split檔案(上一步生成)來建立並初始化Map任務和Reduce任務。

階段三:分配任務

       JobTracker和TaskTracker之間通訊和任務分配是通過心跳機制來完成的,每個TaskTracker作為一個單獨的JVM執行一個簡單的迴圈。

       TaskTracker每隔一段時間都會向JobTracker彙報它的任務進展報告,JobTracker在收到進展報告以後如果發現任務完成了,就會給它再分配新的任務。

       一般來說TaskTracker有個任務槽,它是有容量限制的 - 只能裝載一定個數的Map/Reduce任務。

       這一步和下一步,就形成一次心跳。

階段四:執行任務

       這一步的主體是TaskTracker,主要任務是實現任務的本地化。

       具體步驟如下:

1. 將job.split複製到本地

2. 將job.jar複製到本地

3. 將job的配置資訊寫入到job.xml

4. 建立本地任務目錄,解壓job.jar

5. 釋出任務並在新的JVM裡執行此任務。

6. 最後將計算結果儲存到本地快取

小結

本文細緻分析了Map/Reduce的作業執行流程。

但在流程的執行過程當中,資料的具體流動途徑也是需要仔細分析的 - 是存放在本地磁碟,還是HDFS

另外,還需要做好錯誤處理 - 比如說某個節點壞了怎麼辦?

這些將在後面的兩篇文章中做出分析和介紹。

相關文章