前言
從執行我們的 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?
另外,還需要做好錯誤處理 - 比如說某個節點壞了怎麼辦?
這些將在後面的兩篇文章中做出分析和介紹。