1. 程式人生 > >Hadoop中job提交詳細過程

Hadoop中job提交詳細過程

1)客戶端執行hadoop jar命令的時候,通過程式中的waitForCompletion(true),進行job的提交,jobPI等等,其中主要的一個工作就是和叢集建立連線,會建立一個yarnRunner(實際上是建立resMgrDelegate)代理物件,這個對提交的時候會呼叫job.submit(),方法進行提交,此方法中會進行一系列的工作,比如確定job的狀態,設定新的A象實際上是一個通訊協議的物件。由這個物件去和RM通訊。

2)客戶端向RM(先請求RMRM再轉向applicationsManager/ASM)申請執行一個mr程式,獲取一個applicationId

3RM會返回給客戶端一個

applicationId和一個共享資源的路徑,用於提交程式執行所需要的共享資源

4)客戶端拿到共享資源的路徑,就開始進行將相關資源寫入到共享資源路徑中,相關資源就包括程式執行所需要的jar包及其他檔案(job.jar)、配置檔案引數job.xml(統一寫入這個配置檔案中)、切片資訊(job.split

5)寫完之後客戶端通過resMgrDelegate.submitApplication(appContext)方法向RM報告檔案寫入完畢,帶著一個appContext的上下文並提交應用程式。

6Rm接收到請求後,將這個請求轉給yarn的資源排程器schedule,排程器會初始化這個應用,並將此應用程式加入到排程佇列中(預設為容量排程),因為可能同時有很多應用在執行,可能沒有資源供當前的程式跑,等待分配資源

resourceManager包括兩個元件:

1、排程器:負責排程任務執行的順序,僅是排程的作用,不參與任何任務的執行

1FIFO先進先出排程器:先來的任務先執行,只有一個佇列

2Capacity容量(計算能力)排程器:有多個佇列,為每個佇列分配不同的資源,每個佇列遵循FIFOhadoop 2中預設的排程模型)

3Fair公平排程器:所有任務平分共享資源

2、工作管理員applicationsManagerASM):負責任務啟動或停止或失敗啟動

7)等到分配到相關資源之後就排程器會先給應用程式在一個nodemanager中分配一個容器(container),然後在容器中先啟動程式的管理者,用於管理任務的執行進度和完成情況,這個管理者叫

APP MASTER(主類是MRAppMaster)。

8MRappmaster會對作業進行初始化,初始化的過程中會建立多個簿記物件(作業簿),用來跟蹤作業的完成。

9)接下來MRAppMaster會啟動相應的maptask,但是不知道啟動幾個啊,也不知道每一個對應的資料切片資訊,怎麼辦?這時候就會去先訪問共享檔案系統中,獲取本作業的輸入切片資訊。會獲取到本job中有幾個maptaskreducetask。此時mrappmaster會首先進行一個決策,就是如果maptask的數量小於10個,而reducetask的數量只有1個,並且輸入大小小於一個塊的作業,就會選用和MRAppmaster同一個JVM中執行任務,因為此時在別的節點上重新啟動容器和銷燬容器的開銷過大不划算,這種模式就是uber模式。然後MRAppMaster會對每一個分片建立一個maptask物件。

10)如果作業不適合作為uber模式執行,此時MRAppMater就會為maptaskreducetask任務向RM申請資源,先發送maptask的請求,再發送reducetask的請求。注意maptask有資料本地化的侷限。優先資料本地化,其次機架本地化最後任意節點。請求返回相應的節點資訊。

11RMMRappMaster返回資源資訊,空閒的資源節點,MRAppmaster就會去相應的nodemanager節點上啟動Container

12)之後會啟動一個YarnChild程序用於執行maptask程式

13Maptask執行之前會首先去共享檔案系統中下拷貝相應的檔案,包括jar包、job.xml檔案以及job.split分片資訊等,下載到本地

14)啟動相應的maptask任務

15maptask進行到80%的時候,MRAppmaster會去啟動reduceTask,啟動過程同上述過程

16)資源回收和銷燬