Application管理 YARN中,Application是指應用程式,他可能啟動多個運行實例,每個運行實例由一個ApplicationMaster與一組該ApplicationMaster啟動的任務組成,他擁有名稱、隊列名、優先順序等屬性,是一個比較寬泛的概念,可以是一個MapReduce作業、 ...
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的"命運"緊緊綁定在一起