本篇繼續對 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
- 可以到原始碼中檢視具體邏輯