在 YARN 中,Application 是指應用程式,它可能啟動多個執行例項,每個執行例項由 —個 ApplicationMaster 與一組該 ApplicationMaster 啟動的任務組成,它擁有名稱、佇列、優先順序等屬性,是一個比較寬泛的概念,可以是一個 MepReduce 作業、一個 DAG 應用程式等。YARN 中 Application 管理涉及應用程式的許可權管理、啟動與關閉、生命週期管理等,本節只介紹最基本的管理內容,比如許可權管理、啟動與關閉等,而生命週期管理則放到下一節中介紹。
一、ApplicationACLsManager
ApplicationACLsManager 負責管理應用程式訪問許可權
- 檢視許可權
- 程式基本資訊:執行時間、優先順序等
- 修改許可權
- 修改程式優先順序、殺死應用程式
二、RMAppManager
RMAppManager
負責應用程式啟動和關閉。接下來結合原始碼主要分析啟動和結束兩個操作。
1、啟動
在「4-1 ResourceManager 功能概述」中,提到了 ClientRMService
處理來自客戶端各種 RPC 請求,比如提交、終止獲取應用執行狀態等。
ClientRMService
當收到客戶端提交的應用後,將呼叫函式 RMAppManager#submitApplication
建立一個 RMApp
物件,維護應用程式的整個生命週期。
protected void submitApplication() {
// 建立 app,並新增到 RMActiveServiceContext.applications
RMAppImpl application =
createAndPopulateNewRMApp(submissionContext, submitTime, user, false);
// 傳送 app start event,繼續由其他事件處理器處理
this.rmContext.getDispatcher().getEventHandler()
.handle(new RMAppEvent(applicationId, RMAppEventType.START));
}
2、結束
當 RMAPP 執行結束後,將向 RMAPPManager 傳送一個 RMAPPManagerEventType.APP_COMPLETED
事件。看原始碼將執行 3 個操作:
public void handle(RMAppManagerEvent event) {
ApplicationId applicationId = event.getApplicationId();
LOG.debug("RMAppManager processing event for "
+ applicationId + " of type " + event.getType());
switch(event.getType()) {
case APP_COMPLETED:
{
finishApplication(applicationId);
logApplicationSummary(applicationId);
checkAppNumCompletedLimit();
}
finishApplication()
- 將 Application 放入到記憶體的已完成列表
completedApps
中,使用者可查詢歷史應用執行資訊(如 yarn web)。
- 將 Application 放入到記憶體的已完成列表
logApplicationSummary()
- 列印日誌資訊。
checkAppNumCompletedLimit()
- 上面提到的
completedApps
列表容量有限,預設 10000,可修改。超過該值時,將從在這裡被移除,後續可從 History Server 中進行檢視。 - 將應用程式從
RMStateStore
中移除。RMStateStore 記錄了執行中的應用程式的執行日誌,當叢集故障重啟後,RM 可透過這些日誌恢復應用程式執行狀態,從而避免全部重新執行,一旦應用程式執行結束後,這些日誌便失去了意義, 故可以對其進行刪除。
- 上面提到的
三、ContainerAllocationExpirer
當 AM 獲得 Container 後,必須在一定時間內(預設為 10min,可修改),在對應的 NM 上啟動該 Container,否則 RM 將強制回收該 Container。因為 YARN 不允許 AM 長時間不對其使用,會降低整個叢集的利用率。
protected void expire(AllocationExpirationInfo allocationExpirationInfo) {
dispatcher.handle(new ContainerExpiredSchedulerEvent(
allocationExpirationInfo.getContainerId(),
allocationExpirationInfo.isIncrease()));
}
該類也繼承自抽象類 AbstractLivelinessMonitor
,前面已經講過,這裡不再贅述。