天天看點

MapReduce作業送出流程(詳解)

文章來源:知乎

原文連結:  職業法師劉海柱

MapReduce作業送出流程(詳解)
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所在容器和任務所在容器銷毀工作狀态(中間的輸出結果删除)。作業的資訊被作業曆史伺服器存檔以備以後查詢使用。

繼續閱讀