在 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,前面已經講過,這里不再贅述,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541717.html
標籤:其他
