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

大資料王小皮發表於2022-12-26

本篇繼續對 RM 中管理 NodeManager 的部分進行深入的講解。主要有三個部分:檢查 NM 是否存活;管理 NM 的黑白名單;響應 NM RPC 請求。

一、簡介

在 RM 的主從結構中,最主要的就是 RM 和 NM 之間的主從結構。RM 作為「管理員」,管理下面多個 NM 節點。如何檢測 NM 是否存活,劃分黑白名單,以及如何相應 NM RPC 請求,將在下面進行詳細介紹。

二、NM 管理主要組成

一)NMLivelinessMonitor

  • 檢測 NM 活性的服務,是否有心跳
  • 當前正在執行的 NM 會儲存在 RM 的一個資料結構中,NMLivelinessMonitor 就週期遍歷,若一個 NM 在一定時間(預設10分鐘)未彙報心跳,則任務其掛了
  • NM 被認為掛了後,其上的 Container 會自動置為執行失敗,並通知給 AM,由 AM 決定後續處理方案

二)NodesListManager

  • 管理 exclude(類似黑名單)和 include(類似白名單)列表
  • 啟動時,它們分別從yarn.resourcemanager.nodes.include-path 以及 yarn.resourcemanager.nodes.exclude-path中讀取
  • 黑名單列表中的nodes不能夠和RM直接通訊(直接丟擲RPC異常)
  • 可以動態載入,使用命令 yarn rmadmin -refreshNodes

三)ResourceTrackerService

ResourceTrackerService 是 RPC 協議 ResourceTracker 的一個實現,它作為一個 RPC Server 端接收 NodeManager 的 RPC 請求。
請求主要包含2種資訊,1)註冊NodeManager。2)處理心跳資訊。

  • 註冊 NodeManager 處理:ResourceTrackerService#registerNodeManager
// ResourceTrackerService#registerNodeManager
  public RegisterNodeManagerResponse registerNodeManager(
      RegisterNodeManagerRequest request) throws YarnException,
      IOException {
    // nm 節點資訊 - ip、埠、資源、版本
    NodeId nodeId = request.getNodeId();
    String host = nodeId.getHost();
    int cmPort = nodeId.getPort();
    int httpPort = request.getHttpPort();
    Resource capability = request.getResource();
    String nodeManagerVersion = request.getNMVersion();

    RegisterNodeManagerResponse response = recordFactory
        .newRecordInstance(RegisterNodeManagerResponse.class);

    // 檢查版本
    if (!minimumNodeManagerVersion.equals("NONE")) {
      if (minimumNodeManagerVersion.equals("EqualToRM")) {
        minimumNodeManagerVersion = YarnVersionInfo.getVersion();
      }

      if ((nodeManagerVersion == null) ||
          (VersionUtil.compareVersions(nodeManagerVersion,minimumNodeManagerVersion)) < 0) {
        String message =
            "Disallowed NodeManager Version " + nodeManagerVersion
                + ", is less than the minimum version "
                + minimumNodeManagerVersion + " sending SHUTDOWN signal to "
                + "NodeManager.";
        LOG.info(message);
        response.setDiagnosticsMessage(message);
        response.setNodeAction(NodeAction.SHUTDOWN);
        return response;
      }
    }
  • 處理心跳
    • 可以到原始碼中檢視具體邏輯 ResourceTracker#nodeHeart
    • 接收並檢查 nm 彙報的心跳資訊
    • NodeHeartbeatResponse 中 set 需要釋放的 Container 列表、Application 列表等資訊
    • 向 RMNode 傳送該 NodeManager 的狀態資訊並且儲存最近一次心跳應答資訊
    • 返回 `NodeHeartbeatResponse

相關文章