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

2022-12-24 06:00:39

上一篇文章對 ResourceManager 整體架構和功能進行了講述。本篇將對 RM 中管理 Application Master 的部分進行深入的講解。
下面將會介紹 RM 與 AM 整體通訊執行流程,並對 RM 中涉及的對應服務進行具體講解。
為了更好的學習本篇知識,建議先熟悉以下知識點,不瞭解的部分可翻到前面對應的文章進行學習:

  • RPC(2-2 Yarn 基礎庫 - 底層通訊庫 RPC)
  • 事件處理器(2-3 Yarn 基礎庫 - 服務庫與事件庫)
  • AM 程式執行流程(3-3 Yarn Application Master 編寫)

一、AM 執行流程

使用者端提交任務到 RM 後,啟動 AM 到任務完成的流程如下所示:

各個步驟具體執行操作請對應下面各服務講解。

二、AM 管理主要組成

ApplictionMaster 管理部分主要由三個服務構成,它們共同管理應用程式的 AM 的生存週期。
(以下服務均能根據名稱找到原始碼中對應的類,可以看其具體的實現邏輯)

一)ApplicationMasterLauncher

  • 「服務&事件處理器」處理 AM 的 LAUNCH 和 CLEANUP 事件
  • 從原始碼中可以看到:EventHandler 的 handle 方法收到 AM 事件後建立 Runnable 物件,之後會放到 masterEvents 阻塞佇列中,launcherHandlingThread 不斷從佇列中取出事件,提交到執行緒池 launcherPool 中處理。(流程圖如下所示)

二)AMLivelinessMonitor

  • 檢查服務活性(是否有心跳)
  • 繼承自抽象類 AbstractLivelinessMonitor,在抽象類中已經實現好 live 檢查邏輯,在一段時間內未彙報心跳資訊,則任務其掛了。AMLivelinessMonitor 只需定義當 AM 被認為掛了(expire)時,需要處理的邏輯。
  • 當失敗時會發一個 RMAppAttemptEvent EXPIRE 事件。

抽象類 AbstractLivelinessMonitor 簡要介紹:

public abstract class AbstractLivelinessMonitor<O> extends AbstractService {
    
// 裡面最重要的檢查函數
// 定期遍歷記錄的 list,看是否有超時的
// 檢查週期預設為超時時間的 1/3
  private class PingChecker implements Runnable {

    @Override
    public void run() {
      while (!stopped && !Thread.currentThread().isInterrupted()) {
        synchronized (AbstractLivelinessMonitor.this) {
          Iterator<Map.Entry<O, Long>> iterator = 
            running.entrySet().iterator();

          //avoid calculating current time everytime in loop
          long currentTime = clock.getTime();

          while (iterator.hasNext()) {
            Map.Entry<O, Long> entry = iterator.next();
            if (currentTime > entry.getValue() + expireInterval) {
              iterator.remove();
              expire(entry.getKey());
              LOG.info("Expired:" + entry.getKey().toString() + 
                      " Timed out after " + expireInterval/1000 + " secs");
            }
          }
        }
        try {
          Thread.sleep(monitorInterval);
        } catch (InterruptedException e) {
          LOG.info(getName() + " thread interrupted");
          break;
        }
      }
    }
  }

三)ApplicationMasterService

  • 是 RM RPC 伺服器端 ApplicationMasterProtocol 的實現類。
  • 接收處理來自 AM 的請求:主要包括註冊、心跳、清理三類。
  • 心跳通過 ApplicationMasterProtocol#allocate 方法定期呼叫實現,主要作用:
    • 請求資源
    • 獲取新分配的資源
    • 定期告訴 RM 其還活著(心跳)

三、小結

本篇主要介紹了 RM 中對 AM 的管理部分。首先介紹了 RM 相關元件與 AM 互動流程,之後對各服務執行邏輯、RPC 呼叫等進行了詳細的介紹。本篇中僅對 ApplicationMasterLauncher 元件進行了詳細講解,並繪圖說明,其餘部分各位同學感興趣可自行梳理。
在學習這部分知識時,建議對照原始碼進行梳理,可以更好的瞭解其中的流程。