前言

  從執行我們的 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?

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

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