ResourceManager 和 NodeManager 之间是如何通信的?心跳机制的主要作用包含哪些?
在 Hadoop YARN 架构中,ResourceManager (RM) 是全局的资源管理器,而 NodeManager (NM) 是每个节点上的代理。它们之间的通信和心跳机制是整个 YARN 集群能够正常运行的基石。
以下是关于它们如何通信以及心跳机制作用的详细解析:
一、 ResourceManager 和 NodeManager 之间是如何通信的?
RM 和 NM 之间的通信具有以下几个核心特点:
- 基于 Hadoop RPC 协议:
RM 和 NM 之间底层通过 Hadoop RPC (Remote Procedure Call) 进行跨节点通信。 - 特定的通信接口 (
ResourceTracker):
NM 和 RM 之间的通信严格遵循ResourceTracker协议(在代码中通常表现为ResourceTrackerPB)。 - “拉取”模式(单向发起):
永远是由 NodeManager 主动向 ResourceManager 发起请求,ResourceManager 被动接收并给予响应。RM 从不会主动连接 NM。 - 通信的两个主要阶段:
- 节点注册(Register):当 NM 启动时,它会主动向 RM 发送注册请求,汇报自身所在节点的硬件信息(如可用的 CPU 核数、内存总大小)以及对外服务的端口等。
- 心跳汇报(Heartbeat):注册成功后,NM 会周期性地(默认通常是 1 秒,会根据集群规模动态调整)向 RM 发送心跳包。
二、 心跳机制的主要作用包含哪些?
心跳(Heartbeat)不仅仅是用来告诉 RM “我还活着”,它是双向信息交换的载体。心跳机制的作用可以分为 “NM 向 RM 汇报状态” 和 “RM 向 NM 下达指令” 两个方面:
1. NodeManager 向 ResourceManager 汇报状态(上报信息)
- 保活机制 (Keep-alive):
最基本的作用,向 RM 证明该节点正在正常运行。如果 RM 在一段时间内(默认 10 分钟,由yarn.nm.liveness-monitor.expiry-interval-ms控制)没有收到某台 NM 的心跳,就会将其标记为 LOST(丢失),并重新分配该节点上的任务。 - 节点健康状况汇报 (Node Health Status):
NM 会运行健康检查脚本或检测磁盘损坏情况。如果节点不健康(例如本地磁盘空间不足或损坏),NM 会在心跳中告诉 RM。RM 收到后会将该节点标记为UNHEALTHY,不再向其分配新的任务。 - Container 运行状态汇报:
NM 会将本节点上所有 Container 的状态(如NEW、RUNNING、COMPLETE、KILLED)上报给 RM。特别是当 Container 运行结束(成功或失败)释放资源时,RM 必须通过心跳得知,以便将这些资源重新放入可用资源池中。 - 资源使用情况汇报:
汇报当前节点已使用的资源和剩余的可用资源(CPU、内存等),这为 RM 的调度器(Scheduler)分配新任务提供了实时的数据支持。
2. ResourceManager 向 NodeManager 下达指令(响应心跳)
因为 RM 不能主动连接 NM,所以 RM 对 NM 的所有控制指令都是包含在心跳响应(Heartbeat Response) 中带回给 NM 的。这些指令主要包括:
- 清理/杀死 Container (
ContainersToCleanup):
如果某个任务被用户手动 Kill,或者 ApplicationMaster 决定停止某个 Container,或者该 Container 占用的资源超标(OOM),RM 会在心跳响应中要求 NM 杀死并清理对应的 Container。 - 清理应用程序 (
ApplicationsToCleanup):
当一个 Application 彻底运行结束时,RM 会通知相关的所有 NM 清理该 Application 产生的本地临时文件、日志和工作目录。 - 安全与令牌更新:
在开启了 Kerberos 安全认证的集群中,RM 会通过心跳响应向 NM 分发或更新 Master Key 和 Delegation Tokens(委托令牌),以确保节点之间的安全通信。
总结
ResourceManager 和 NodeManager 之间通过 RPC 协议 采用 NM 主动汇报 的方式进行通信。其心跳机制不仅是集群的“脉搏”(保活和健康监测),更是 YARN 进行分布式资源视图同步(NM 上报资源和 Container 状态)和分布式任务控制(RM 下发清理和终止指令)的核心通道。