1. 程式人生 > >ResourceManager學習之Application,狀態機管理

ResourceManager學習之Application,狀態機管理

Application管理

YARN中,Application是指應用程式,他可能啟動多個執行例項,每個執行例項由一個ApplicationMaster與一組該ApplicationMaster啟動的任務組成,他擁有名稱、佇列名、優先順序等屬性,是一個比較寬泛的概念,可以是一個MapReduce作業、一個DAG應用程式,設定可以是一個Storm叢集例項

(1) ApplicationACLsManager

ApplicationACLsManager負責管理應用程式的訪問許可權,包含兩部分許可權:檢視許可權和修改許可權。其中,檢視許可權主要用於檢視應用程式基本資訊,比如執行時間、優先順序等資訊;而修改許可權則主要用於修改應用程式優先順序、殺死應用程式等。預設情況下,任意一個普通使用者可以檢視所有其他使用者的應用程式。使用者可以為自己的應用程式設定具有訪問許可權的使用者列表,具體方法是在客戶端使用ContainerLaunchContext#newInstance構造ContainerLaunchContext例項時將其作為引數傳入。

通常而言,為了便於使用者設定該引數,執行在YARN之上的計算框架會預留一些引數供使用者提交應用程式時動態設定,比如MapReduce計算框架允許使用者通過引數mapreduce.job.acl-view-job和mapreduce.job.acl-modify-job為每個應用程式設定檢視和修改許可權

(2) RMAppManager

RMAppManager負責應用程式的啟動和關閉。ClientRMService收到來自客戶端的提交應用程式請求後,將呼叫函式RMAppManager#submitApplication建立一個RMApp物件,它將維護這個應用程式的整個生命週期,從開始執行到最終結束;當RMApp執行結束後,將向RMAppManager傳送一個RMAppManagerEventType.APP_COMPLETED事件,他收到該事件後將呼叫RMARMAppManager#finishApplication進行收尾工作,包括 :

  • 將該應用程式放入已完成應用程式列表中,以便使用者查詢歷史應用程式執行資訊。需要注意的是,該列表的大小是有限的,預設是10000(管理員可通過引數yarn.resourcemanager.max-completed-applications修改),當已完成應用程式數目超過該值時,將從記憶體資料結構中移除(移除的應用程式可稱為"過期的應用程式"),這樣使用者只能通過History Server獲取過期的應用程式資訊,History Server是從磁碟檔案中獲取這些資訊的
  • 將應用程式從RMStateStore中移除。RMStateStore記錄了執行中的應用程式的執行日誌,當叢集故障重啟後,ResourceManager可通過這些日誌恢復應用程式執行狀態,從而避免全部重新執行,一旦應用程式執行結束後,這些日誌便失去了意義,故可以對其進行刪除。這屬於ResourceManager容錯機制的範疇
(3) ContainerAllocationExpirer

當一個AM獲得一個Container後,YARN不允許AM長時間不對其使用,因為這會降低整個叢集的利用率。當AM收到RM新分配的一個Container後,必須在一定的時間內在對應的NM上啟動該Container,否則RM將強制回收該Container

狀態機管理

YARN中,如果一個物件由若干個狀態以及觸發這些狀態發生轉移的事件構成,它將被抽象成一個狀態機,在YARN ResourceManager內部,共有四類狀態機,分別是RMApp,RMAppAttempt,RMContainer和RMNode。其中,前2類狀態機維護了一個應用程式相關的生命週期,包括Application生命週期,一次進行嘗試的生命週期;RMContainer則維護了分配出去的各個資源的使用狀態;RMNode維護了一個NodeManager的生命週期

YARN中的Application生命週期由狀態機RMAppImpl維護,每個Application可能會嘗試執行多次,每次成為一次"執行嘗試",而每次執行嘗試的生命週期則由狀態機RMAppAttemptImpl維護,如果一次執行嘗試執行失敗,RMApp會建立另外一個執行嘗試,知道某次執行嘗試執行成功或者達到執行嘗試上限。對於每次執行嘗試,ResourceManager將為它分配一個Container,Container是執行環境的抽象,內部封裝了任務的執行環境和資源等資訊,而一個應用程式的ApplicationMaster就執行在這個Container中。ApplicationMaster啟動之後,會不斷向ResourceManager申請Container以執行各類任務。Container的生命週期由狀態機RMContainerImpl維護

Application Attempt的生命週期與ApplicationMaster的生命週期基本上是一致的 : 一個Application內部所有任務均由ApplicationMaster維護和管理,ApplicationMaster本身需要佔用一個Container,而這個Container由ResourceManager為其申請和啟動。一旦ApplicationMaster成功啟動,他就會與ResourceManager通訊,為它內部的任務申請Container。如果ApplicationMaster重新啟動,則意味著一個新的Application Attempt被啟動,換句話說,一個Application Attempt的"生死存亡"與ApplicationMaster的"命運"緊緊繫結在一起

我每天會寫文章記錄大資料技術學習之路,另外我自己整理了些大資料的學習資料,目前全部放在我的公眾號"SmallBird技術分享",加入我們一起學習交流,並且回覆'分享'會有大資料資源驚喜等著