【深入淺出 Yarn 架構與實現】4-4 RM 管理 Application

大資料王小皮發表於2023-01-11

在 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)。
  • 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,前面已經講過,這裡不再贅述。

相關文章