基于本文回答
0
评论

ApplicationMaster 是如何与 ResourceManager 交互的?

知识点图片

在 Hadoop YARN 架构中,ApplicationMaster (AM)ResourceManager (RM) 之间的交互是整个分布式计算资源调度和任务执行的核心。

简单来说,RM 是整个集群的“大管家”(负责全局资源分配),而 AM 是单个应用程序的“项目经理”(负责向大管家申请资源,并管理自己手下的任务)。

它们之间的交互主要是一个完整的生命周期,分为 注册、资源协商与心跳、注销 三个主要阶段。以下是详细的交互过程:


1. 第一阶段:AM 注册 (Registration)

当客户端提交一个应用程序后,RM 会在集群中分配第一个 Container 并启动该应用的 ApplicationMaster。AM 启动后的第一件事就是向 RM 注册。

  • 交互方法:AM 调用 RM 的 registerApplicationMaster RPC 接口。
  • AM 发送给 RM 的信息
    • AM 所在的宿主机 (Host)。
    • AM 的 RPC 端口(以便后续通信)。
    • Tracking URL(用于在 YARN Web UI 上追踪作业执行进度的链接)。
  • RM 返回给 AM 的信息
    • 集群的最大/最小资源能力(例如单个 Container 最大能申请多少内存和 CPU,防止 AM 乱申请)。
    • 访问控制列表 (ACLs) 等集群元数据。

2. 第二阶段:资源协商与心跳 (Resource Negotiation & Heartbeats)

这是交互最频繁、最核心的阶段。AM 需要不断地向 RM 发送心跳包(通常是一秒一次)。在 YARN 中,心跳和资源申请/释放是合并在同一个 RPC 调用中完成的。

  • 交互方法:AM 定期调用 RM 的 allocate RPC 接口。
  • AM 发送给 RM 的信息 (Ask)
    • 资源请求 (Resource Requests):AM 根据任务计算出需要多少资源。请求包含:需要的内存、CPU核数、数量、优先级,以及数据本地性偏好(希望分配在哪个具体的 NodeManager 或机架上)。
    • 释放资源 (Release Requests):如果某些 Container 已经运行完毕,AM 会在这里告诉 RM 回收这些资源。
    • 进度汇报:当前应用程序的整体执行进度(0% - 100%)。
  • RM 返回给 AM 的信息 (Response)
    • 新分配的 Container:RM 根据集群可用资源和调度策略(如容量调度、公平调度),将分配到的 Container 列表(包含所在节点、资源量、用于与 NodeManager 通信的 Token)返回给 AM。
    • Container 运行状态:RM 会告诉 AM 之前分配的 Container 的状态(例如某个任务所在的 Container 是成功退出还是崩溃了),以便 AM 决定是否需要重新拉起任务。
    • 抢占信号 (Preemption):如果集群资源紧张,RM 可能会要求 AM 归还部分资源,这也会通过此接口通知 AM。

注意:资源请求是异步的。AM 在第 1 次心跳中提出资源申请,RM 记录下来去调度,AM 可能在第 3 次或更后面的心跳响应中才会真正拿到分配的 Container。

3. 第三阶段:AM 注销 (Unregistration)

当应用程序的所有任务都执行完毕(无论成功、失败还是被 Kill),AM 需要体面地退出,并将情况汇报给 RM。

  • 交互方法:AM 调用 RM 的 finishApplicationMaster RPC 接口。
  • AM 发送给 RM 的信息
    • 应用程序的最终状态(SUCCEEDED, FAILED, KILLED)。
    • 诊断信息(如果失败了,错误日志是什么)。
    • 最终的 Tracking URL(通常指向 JobHistoryServer,用于任务结束后查看历史日志)。
  • RM 的动作
    • 将该应用程序标记为完成。
    • 通知对应的 NodeManager 回收 AM 自己所在的那个 Container,彻底释放资源。

总结:交互协议与底层机制

  • 通信协议:它们之间的通信严格遵守 ApplicationMasterProtocol。底层使用的是 Hadoop RPC 机制,通常基于 Protobuf 进行序列化。
  • 安全机制:为了防止恶意的 AM 冒充合法应用申请资源,RM 在启动 AM 时会为其生成一个 AMRMToken。AM 每次与 RM 交互(如调用 allocate)时,都必须携带这个 Token 进行身份认证。每次心跳时,RM 也有机制动态更新这个 Token。
  • 容错机制
    • 如果 AM 挂了:RM 长时间收不到 AM 的心跳,会认为 AM 宕机。RM 会在另一个节点上分配一个新的 Container 重新启动这个 AM(重试次数由配置决定,如默认2次)。
    • 如果 RM 挂了:在启用了 RM HA(高可用)的情况下,AM 会捕获到连接异常,并自动尝试连接到新的 Standby 转 Active 的 RM,重新同步状态。

一句话概括:AM 通过 RPC 协议向 RM 注册自己,随后通过周期性的 allocate 心跳一边汇报进度、一边申请或释放资源,最后任务结束时向 RM 注销以释放所有系统资源。

右滑查看面试常问