MapReduce作業提交流程

1、客戶端,提交MapReduce作業

2、YARN的資源管理器(Resource Manager),協調集羣中計算資源的分配

3、YARN的節點管理器(Node Manager),啟動並監控集羣中的計算容器

4、MapReduce的Application Master,協調MapReduce作業中任務的運行。Application Master和MapReduce任務運行於容器中,這些容器由resourcemanager調度,由nodemanager管理。

5、分散式文件系統(一般是HDFS),在組件之間共享作業數據。

Job對象的submit方法創建了一個內部的JobSubmitter實例並調用該實例的submitJobInternal方法。一旦提交了作業,waitForCompletion方法每秒鐘輪詢作業的執行進度,如果進度發生了變化,則向控制檯報告進度。當作業成功完成,展示作業計數器的數據。否則展示作業失敗的錯誤日誌信息。

obSubmitter實現的作業提交的過程有如下幾個步驟:

1、向resourcemanager申請一個新的application ID,用於MapReduce作業的ID

2、檢查作業的輸出。如果沒有指定輸出或者輸出路徑已經存在,則不提交作業,MapReduce程序拋異常

3、計算作業的輸入切片。如果不能計算切片(比如輸入路徑不存在等),不提交作業,MR程序拋異常。

4、拷貝執行作業需要的資源到共享文件系統的以作業ID命名的目錄中,這些資源包括作業的jar包,配置文件,計算好的輸入切片。作業的jar包有一個很高的副本數量(mapreduce.client.submit.file.replication指定,默認值是10),這樣當nodemanager如果運行作業中的任務,會有很多副本可以訪問。

5、調用resourcemanager的submitApplication方法提交作業。

MR初始化

1、YARN為請求分配一個容器,resourcemanager通過容器所在節點上的nodemanager在該容器中啟動application master進程。

2、MapReduce作業的application master是一個java app,主入口類是MRAppMaster。從HDFS抽取客戶端計算好的輸入切片,為每一個切片創建一個map任務對象,以及一定數量的reduce任務對象。

MR作業佈置:

application master會為作業中所有的map任務以及reduce任務向resourcemanager請求容器。為map任務的請求會首先進行並且相對於reduce任務請求有更高的優先順序。當map任務完成率達到了5%之後才會為reduce任務發送容器請求。

reduce任務可以運行於集羣中的任意位置,而map任務會有本地讀取數據的限制。移動計算而不是數據。數據本地。次之為機架本地。

請求會指定每個任務需要的內存和cpu資源。默認情況下為每個map任務或reduce任務分配1024MB的內存和一個虛擬核心。這些值對於每個作業都是可以配置的:mapreduce.map.memory.mb,mapreduce.reduce.memory.mb,mapreduce.map.cpu.vcores以及mapreduce.reduce.cpu.vcores。

MR作業任務執行:

一旦resourcemanager在一個節點上的一個容器中為一個任務分配了資源,application master與nodemanager通信,啟動容器。任務通過一個java app來執行,該app的主入口類是YarnChild。在它可以開始任務的執行之前,它要本地化任務需要的資源,包括jar包,配置文件,以及分散式緩存中存儲的其他共享文件。最後,它開始運行map任務或者reduce任務。

MR作業完成:

當作業的最後一個任務完成並通知application master,AppMaster就更改作業的狀態為」successfully」。作業就列印信息告知客戶端,客戶端waitForCompletion方法返回。此時也會在控制檯列印作業的統計信息和計數器的信息。

作業完成,application master所在容器和任務所在容器銷毀工作狀態(中間的輸出結果刪除)。作業的信息被作業歷史伺服器存檔以備以後查詢使用。


推薦閱讀:
相關文章