设为首页 加入收藏

TOP

【深入浅出 Yarn 架构与实现】6-1 NodeManager 功能概述(一)
2023-07-25 21:34:25 】 浏览:37
Tags:Yarn 6-1 NodeManager 能概述

本节开始将对 Yarn 中的 NodeManager 服务进行剖析。
NodeManager 需要在每个计算节点上运行,与 ResourceManager 和 ApplicationMaster 进行交互。管理节点的计算资源以及调度容器。后续将对 NM 的功能职责、状态机、容器生命周期和资源隔离等方面进行讲解。本篇将从整体上对 NM 进行介绍。

一、NodeManager 基本职能

在 Hadoop 集群中,每个计算节点都需要有一个管理服务,其就是 NodeManager(NM)。
它负责与 ResourceManager 保持通信,管理 Container 的生命周期,监控每个 Container 的资源使用情况,追踪节点健康状况,管理日志等。
主要职责:

  1. 保持与 ResourceManager 同步
  2. 跟踪节点的健康状况
  3. 管理节点各个 Container 的生命周期,监控每个 Container 的资源使用情况
  4. 管理分布式缓存(对 Container 所需的 Jar,库文件的本地文件系统缓存)
  5. 管理各个 Container 生成日志

整体来说,NM 通过两个 RPC 协议与 RM 和 AM 交互,如下图所示。
image.png

一)与 RM 交互

通过 ResourceTrackerProtocol 协议:

  • NM 通过该 RPC 协议向 RM 注册、汇报节点健康状况和 Container 运行状态;
  • 领取 RM 下达的命令,包括重新初始化、清理 Container 占用资源等。

在该协议中,RM 扮演 RPC server 的角色,而 NM 扮演 RPC Client 的角色(由内部组件 NodeStatusUpdater 实现)。NM 与 RM 之间采用 「pull 模型」,NM 总是周期性地主动向 RM 发起请求,并领取下达给自己的命令。

二)与 AM 交互

通过 ContainerManagementProtocol 协议:

  • 应用程序的 AM 通过该 RPC 协议向 NM 发起 Container 的相关操作(启动、kill、获取 Container 执行状态等)。

在该协议中,AM 扮演 RPC Client 的角色,而 NM 扮演 RPC Server 的角色(由内部组件 ContainerManager 实现)。NM 与 AM 之间采用「push 模型」,AM 可以将 Container 相关操作的第一时间告诉 NM,相比于「pull 模型」,可以大大降低时间延迟。

二、NodeManager 内部结构

NodeManager 内部由多个组件构成,如下图所示。其中最主要的三个组件是:NodeStatusUpdaterContainerManagerNodeHealthCheckService
image.png

一)NodeStatusUpdater

NodeStatusUpdater 是 NM 与 RM 通信的唯一通道。

  • 当 NM 启动时,该组件负责向 RM 注册,并汇报节点上总的可用资源;
  • 之后,该组件周期性与 RM 通信,汇报各个 Container 的状态更新(包括节点上正在运行的 Container、已经完成的 Container 等信息);
  • 同时 RM 会返回待清理的 Container 列表、待清理的应用程序列表、诊断信息、各种 Token 等信息。

心跳汇报流程:
NodeStatusUpdaterImpl 中发送心跳。resourceTracker 实际是一个 RPC stub,通过 RPC 的方式调用 RM 端方法的。

// yarn/server/nodemanager/NodeStatusUpdaterImpl.java

  protected void startStatusUpdater() {
      // ...
            // 发送 nm 的心跳
            response = resourceTracker.nodeHeartbeat(request);

找到对应包下面的 proto 文件:

hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/proto
├── SCMUploader.proto
├── yarn_server_common_service_protos.proto
├── ResourceTracker.proto
└── yarn_server_common_protos.proto

汇报的 proto 如下。能看到包含的信息有:node_id, containersStatuses, containers_utilization, node_utilization, nodeLabels 等信息。

message NodeHeartbeatRequestProto {
  optional NodeStatusProto node_status = 1;
  optional MasterKeyProto last_known_container_token_master_key = 2;
  optional MasterKeyProto last_known_nm_token_master_key = 3;
  optional NodeLabelsProto nodeLabels = 4;
  repeated LogAggregationReportProto log_aggregation_reports_for_apps = 5;
}

message NodeStatusProto {
  optional NodeIdProto node_id = 1;
  optional int32 response_id = 2;
  repeated ContainerStatusProto containersStatuses = 3;
  optional NodeHealthStatusProto nodeHealthStatus = 4;
  repeated ApplicationIdProto keep_alive_applications = 5;
  optional ResourceUtilizationProto containers_utilization = 6;
  optional ResourceUtilizationProto node_utilization = 7;
  repeated ContainerProto increased_containers = 8;
}

二)ContainerManager

ContainerManager 是 NM 中最核心的组件之一,它由多个子组件组成,每个子组件负责一部分功能,协同管理运行在该节点上的所有 Container,各个子组件如下。

  • RPC Server:该 RPC Server 实现了 ContainerManagementProtocol 协议,是 AM 与 NM 通信的唯一通道。ContainerManager 从各个 AM 上接收 RPC 请求以启动新的 Container 或者 停止正在运行的 Container。需要注意的是,任何 Container 操作均会经 ContainerTokenSecretManager 合法性验证,以防止伪造启动或停止 Container 的命令。
  • ResourceLocalizationService:负责 Container 所需资源的本地化,它能够按照描述从 HDFS 上下载 Container 所需的文件资源,并尽量将它们分摊到各个磁盘上以防止出现热点访问。此外,它会为下载的文件添加访问控制限制,并为之施加合适的磁盘空间使用份额。
  • ContianersLauncher:维护了一个线程
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java阻塞队列中的异类,Synchrono.. 下一篇Java:如何在PowerPoint幻灯片中..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目