ResourceManager學習之Application,狀態機管理

Application管理

YARN中,Application是指應用程序,他可能啓動多個運行實例,每一個運行實例由一個ApplicationMaster與一組該ApplicationMaster啓動的任務組成,他擁有名稱、隊列名、優先級等屬性,是一個比較寬泛的概念,能夠是一個MapReduce做業、一個DAG應用程序,設置能夠是一個Storm集羣實例數據結構

(1) ApplicationACLsManager

ApplicationACLsManager負責管理應用程序的訪問權限,包含兩部分權限:查看權限和修改權限。其中,查看權限主要用於查看應用程序基本信息,好比運行時間、優先級等信息;而修改權限則主要用於修改應用程序優先級、殺死應用程序等。默認狀況下,任意一個普通用戶能夠查看全部其餘用戶的應用程序。用戶能夠爲本身的應用程序設置具備訪問權限的用戶列表,具體方法是在客戶端使用ContainerLaunchContext#newInstance構造ContainerLaunchContext實例時將其做爲參數傳入。app

一般而言,爲了便於用戶設置該參數,運行在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的"命運"牢牢綁定在一塊兒orm

我天天會寫文章記錄大數據技術學習之路,另外我本身整理了些大數據的學習資料,目前所有放在個人公衆號"SmallBird技術分享",加入咱們一塊兒學習交流,而且回覆'分享'會有大數據資源驚喜等着你~

相關文章
相關標籤/搜索