在 YARN 中,Application 是指應用程式,它可能啟動多個運行實例,每個運行實例由 —個 ApplicationMaster 與一組該 ApplicationMaster 啟動的任務組成,它擁有名稱、隊列、優先順序等屬性,是一個比較寬泛的概念,可以是一個 MepReduce 作業、一個 D... ...
在 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
,前面已經講過,這裡不再贅述。