MapReduce做業的工做原理

         在Hadoop中,咱們能夠經過Job對象的submit()方法來運行MapReduce做業,也能夠調用waitForCompletion()用於提交之前沒有提交過的做業,並等待它的完成。其中,submit()方法調用封裝了大量的處理細節,以下圖所示:緩存

    

 

         在最高層,有5個獨立的實體。app

         客戶端,提交MapReduce做業;分佈式

         YARN資源管理器,負責協調集羣上計算機資源的分配;oop

         YARN節點管理器,負責啓動和監視集羣中機器上的計算容器(container);對象

         MapReduce的application master,負責協調運行MapReduce做業的任務,它和MapReduce任務在容器中運行,這些容器由資源管理器分配並由節點管理器進行管理;blog

         分佈式文件系統(通常爲HDFS),用來與其餘實體間共享做業文件。排序

 

         1 做業的提交

         Job的submit()方法建立一個內部的JobSummiter實例,而且調用其submitJobInternal()方法。提交做業後,waitForCompletion()每秒輪詢做業的進度,若是發現自上次報告後有改變,便把進度報告到控制檯。做業完成後,若是成功,就顯示做業計數器;若是失敗,則致使做業失敗的錯誤被記錄到控制檯。接口

         JobSummiter所實現的做業提交過程以下:進程

         ① 向資源管理器請求愛一個新應用ID,用於MapReduce做業ID;事件

         ② 檢查做業的輸出說明;

         ③ 計算做業的輸入分片;

         ④ 將運行做業所須要的資源(包括做業JAR文件、配置文件和計算所得的輸入分片)複製到一個以做業ID命名的目錄下的共享文件系統中;

         ⑤ 經過調用資源管理器的submitApplication()方法提交做業。

 

         2 做業的初始化

         資源管理器收到調用它的submitApplication()消息後,便將請求傳遞給YARN調度器。調度器分配一個容器,而後資源管理器在節點管理器的管理下載容器中啓動application master的進程。

         MapReduce做業的application master是一個Java應用程序,它的主類是MRAppMaster。因爲將接受來自任務的進度和完成報告,所以application master對做業的初始化是經過建立多個簿記對象以保持對做業進度的跟蹤來完成的。

         接下來,它接受來自共享文件系統的、在客戶端計算的輸入分片。而後對每個分片建立一個map任務對象以及由mapreduce.job.reduces屬性肯定的多個reduce任務對象。任務ID在此時分配。

         最後,在任何任務運行以前,application master調用setupJob()方法設置OutputCommitter。

 

         3 任務的分配

         application master爲不適合做爲uber運行的做業中的全部map任務和reduce任務向資源管理器請求容器。首先爲Map任務發出請求,該請求優先級要高於reduce任務的請求,這是由於全部的map任務必須在reduce的排序階段可以啓動前完成。直到有5%的map任務已經完成時,爲reduce任務的請求才會發出。

reduce任務可以在集羣中運行,可是map任務的請求有着數據本地化侷限。

 

         4 任務的執行

       一旦資源管理器的調度器爲任務分配了一個特定節點上的容器,application master就經過與節點管理器通訊來啓動容器。該任務由主類爲YarnChild的一個Java應用程序執行。在它運行任務以前,首先將任務須要的資源本地化,包括做業的配置、JAR文件和全部來自分佈式緩存的文件。最後,運行map任務或reduce任務。

 

         5 進度和狀態的更新

         一個做業和它的每一個任務都有一個狀態,包括:做業或任務的狀態、map和reduce的進度做業計數器的值、狀態消息或描述。

         任務在運行時,對其進度保持追蹤。對map任務,任務進度是已處理輸入所佔的比例。對reduce任務,系統會估計已處理reduce輸入的比例,整個過程分紅三部分,與shuffle的三個階段相對應(複製、排序、執行)。

         任務也有一組計數器,負責對任務運行過程當中各個事件進行計數。當map任務或reduce任務運行時,子進程和父application master經過umbilical接口通訊。每隔3秒鐘,任務經過這個umbilical接口向本身的application master報告進度和狀態,application master會造成一個做業的匯聚視圖。

 

         6 做業的完成

         當application master收到最後一個任務已完成的通知後,便把做業的狀態設置爲「成功」。而後,在Job輪詢狀態時,便知道任務已成功完成,因而Job打印一條消息告知用戶,而後從waitForCompletion()方法返回。Job的統計信息和計數值也是在這個時候輸出到控制檯。

         最後,做業完成時,application master和任務容器清理其工做狀態,OutputCommitter的commitJob()方法會被調用。

相關文章
相關標籤/搜索