ResourceManager 是如何感知并处理失效的 NM 的?
在 Hadoop YARN 架构中,ResourceManager (RM) 是整个集群的资源“大管家”,而 NodeManager (NM) 是各个节点上的“地方代理”。RM 感知并处理失效 NM 的过程是一个非常经典的心跳机制与状态机驱动的容错流程。
以下是具体的感知与处理过程详解:
一、 RM 如何“感知” NM 失效?(感知机制)
RM 对 NM 存活状态的感知完全依赖于心跳机制 (Heartbeat) 和超时监控 (Liveness Monitor)。
正常的心跳汇报
- NM 在启动后,会向 RM(具体是
ResourceTrackerService组件)注册自己。 - 注册成功后,NM 会周期性(默认 1 秒)向 RM 发送心跳信息。心跳内容包括:节点健康状况、当前运行的 Container 列表、刚完成的 Container 状态等。
- RM 收到心跳后,会更新该 NM 的“最近心跳时间戳”。
- NM 在启动后,会向 RM(具体是
NodeLivenessMonitor 监控超时
- RM 内部运行着一个专门的监控服务:
NodeLivenessMonitor。 - 它是一个后台线程,会周期性地遍历所有已注册的 NM,检查它们的“最近心跳时间戳”。
- 如果
(当前时间 - 最近心跳时间戳) > 超时阈值,RM 就会认定该 NM 已经失效。 - 注:这个超时阈值由参数
yarn.nm.liveness-monitor.expiry-interval-ms控制,默认值为 600,000 毫秒(即 10 分钟)。
- RM 内部运行着一个专门的监控服务:
二、 RM 如何“处理”失效的 NM?(处理流程)
一旦 NodeLivenessMonitor 判定某个 NM 超时,RM 内部会触发一系列的联动处理。整个过程由事件驱动(Event-Driven)和状态机(State Machine)来完成:
1. 状态流转 (State Transition)
RM 内部用 RMNode 对象来维护每个节点的信息。当判定节点超时,RM 会向该 RMNode 发送一个 EXPIRE 事件。
- 节点的状态会从
RUNNING(运行中) 强制转换为LOST(丢失)。
2. 集群资源扣除 (Resource Adjustment)
既然节点 LOST 了,它上面的资源(CPU、内存)也就不能再分配给新的任务了。
- RM 会通知底层调度器(如 CapacityScheduler 或 FairScheduler)。
- 调度器会从集群的总可用资源中减去该失效 NM 上的资源容量,更新集群的全局资源视图。
3. 清理正在运行的 Container (Container Cleanup)
NM 挂掉了,它上面正在运行的所有 Container 必然也随之消亡。
- RM 会遍历该节点上所有处于运行状态的 Container。
- 将这些 Container 的状态标记为
KILLED或FAILED,并生成诊断信息(如 "Node lost")。
4. 通知 ApplicationMaster (Notify AMs)
这是非常关键的一步。RM 自己不负责重试失败的任务,它必须把 Container 失败的消息告诉各个应用程序的“包工头”——ApplicationMaster (AM)。
- RM 不会主动推送消息给 AM,而是等待 AM 下一次向 RM 发送心跳。
- 当 AM 发送心跳(通过
ApplicationMasterService)时,RM 会在心跳响应 (Heartbeat Response) 中,附带上该 AM 在那个失效节点上被杀死的 Container 列表。 - AM 收到通知后的动作: AM 发现自己的任务失败后,会重新向 RM 申请新的资源(在其他健康的 NM 上)来重试这些失败的任务。
5. 如果挂掉的 NM 上运行着 AM 怎么办?
如果失效的节点上正好运行着某个应用程序的 ApplicationMaster 本身,那么整个应用就处于无主状态。
- RM 内部监控 AM 存活的
AMLivenessMonitor也会发现该 AM 失去联系。 - RM 会将该应用的状态标记为失败,并尝试在另一个健康的 NM 上重新启动一个新的 AM(前提是该应用还没有达到最大重试次数,由
yarn.resourcemanager.am.max-attempts控制,默认是 2 次)。
6. 节点移除与拉黑
- 该 NM 会从 RM 的活跃节点列表(Active Nodes List)中被移除,被加入到失效节点列表(Lost Nodes List)中。
- 如果这个 NM 后来网络恢复了,或者被运维人员重启了,它带着旧的信息向 RM 发送心跳,RM 会发现它是一个不合法的/已过期的节点,会命令它执行
Resync(重新同步/重新注册),从而作为全新的节点再次加入集群。
三、 总结与核心配置
总结来说,RM 感知 NM 失效是通过心跳超时,处理 NM 失效的核心动作是:节点判死 -> 扣除资源 -> 标记 Container 死亡 -> 通知 AM 重新调度。
相关的关键配置参数:
yarn.resourcemanager.nodemanagers.heartbeat-interval-ms: NM 向 RM 发送心跳的时间间隔(默认 1000ms)。yarn.nm.liveness-monitor.expiry-interval-ms: RM 判定 NM 死亡的超时时间(默认 600000ms,即 10 分钟。在网络较好的生产环境中,通常会被调小至 1~3 分钟,以便更快速地进行故障转移)。