1. 程式人生 > >YARN執行機制

YARN執行機制

1、作業的提交

    Client提交Job,呼叫Job.submit()方法建立一個JobSubmitter例項,並呼叫其submitJobInternal()方法

     向RM請求一個新的應用ID,用於作業ID(步驟2);檢查作業的輸出說明,計算作業的輸入分片,將執行作業所需要的資源(包括Jar包,配置檔案,split資訊)複製到以作業ID命名的目錄下的共享檔案系統下(步驟3)。作業Jar的副本較多(由mapreduce.client.submit.file.replication控制,預設值為10)

    呼叫RM的submitApplication()方法提交作業(步驟4)。

2、作業的初始化

    當RM收到呼叫它的submitApplication()訊息後,便將請求傳遞給YARN排程器(scheduler),scheduler分配container,然後RM在該container內啟動AM程序,由NM監控(步驟5)

    AM一個主類為MRAppMaster的Java應用程式,通過建立多個bookkeeping物件保持對作業進度的跟蹤(步驟6)

    接下來接受來自共享檔案系統的、在客戶端計算好的輸入split(步驟7),然後為每個輸入split建立一個map任務,根據mapreduce.job.reduces建立Reduce任務物件。任務ID在此時分配。

    注意:

    AM必須決定如何執行構成MapReduce作業的各個任務。如果作業很小,就選擇和自己在同一個JVM上執行任務。與在一個節點上順序執行這些任務相比,當AM判斷在新的container中分配和執行任務的開銷大於並行執行它們的開銷時,就會發生這一情況,即作為uber任務執行

    那麼哪些作業是小作業?預設情況下,小作業就是少於10個mapper且只有一個reduce且輸入大小小於一個HDFS塊的作業。

3、任務分配

    如果作業不適合作為uber任務執行,那麼AM就會為該作業中的map任務和reduce任務向RM請求container(步驟8)。


    首先為map任務發出請求,該請求優先順序要高於reduce任務的請求,這是因為所有的map任務必須在reduce的排序階段能夠啟動前完成。知道有5%的map任務已經完成時,為reduce任務的請求才會發出。

4、任務執行

一旦RM的排程器為任務分配了container後,AM就通過與NM通訊來啟動container(步驟9a)。任務由主類為YarnChild的一個Java應用程式執行。在執行任務之前,首先將該任務需要的資源本地化,包括作業配置、Jar包以及來自分散式快取的所有檔案(步驟10)。最後,執行map任務/reduce任務(步驟11)

5、進度和狀態更新

    YARN中的任務將其進度和狀態(包括counter)返回給AM,Client每秒(通過mapreduce.client.progressmonitor.pollinterval設定)輪詢一次AM以接受最新狀態

6、作業完成

除了向AM請求作業進度外,Client每5分鐘(通過mapreduce.client.completion.pollinterval設定)都會通過呼叫waitForCompletion()來檢查作業是否完成。

    當AM收到作業最後一個任務已完成的通知後,便把作業的狀態設定為"成功"。

    最後,作業完成時,AM和container會清理工作狀態,OutputCommitter的CommitJob()方法會被呼叫。作業資訊由作業歷史伺服器存檔,以便日後使用者需要時可以查詢。