详解 YARN 中的 ResourceManager
- 1.ResourceManager 核心功能
- 2.通信(与三个角色通信)
- 3.模块简介
- 3.1 用户交互模块
- 3.2 NM 管理模块
- 3.3 AM 管理模块
- 3.4 Application 管理模块
- 3.5 状态机模块
- 3.6 安全模块
- 3.7 资源分配模块
- 4.模块详解
- 4.1 用户交互模块
- 4.2 NM 管理模块
- 4.3 AM 管理模块
- 4.4 Application 管理模块
- 5.特点
1.ResourceManager 核心功能
YARN 通过分配资源和调度任务来执行所有处理活动。 Apache Hadoop YARN 架构由以下主要组件组成:
- 资源管理器(
Resource Manager
):在主守护进程上运行并管理集群中的资源分配。 - 节点管理器(
Node Manager
):它们在从属守护进程上运行,负责在每个数据节点上执行任务。 - 应用程序主控(
Application Master
):管理各个应用程序的用户作业生命周期和资源需求。它与节点管理器一起工作并监视任务的执行。 - 容器(
Container
):单个节点上的 RAM、CPU、网络、HDD 等资源的封装。
ResourceManager 的核心功能:集群资源统一管理和调度
- 管理 NodeManager,并接受资源汇报信息
- 管理 ApplicationMaster,并分配资源
- 响应客户端,并处理请求
更多可参考:《了解 YARN 架构的基础知识》
2.通信(与三个角色通信)
- 与 NodeManager 通信(ResourceTracker)
- 注册、心跳(汇报节点健康状况)、Container 运行状态
- 领取执行指令(启动 / 清理 / 删除 Container)
- 与 ApplicationMaster 通信(ApplicationMasterProtocol)
- 注册、心跳
- 申请 / 释放资源
- 与 客户端 通信(ApplicationClientProtocol)
- 提交 / 查询 / 控制应用程序
3.模块简介
3.1 用户交互模块
- ClientRMService:处理普通用户的请求(提交、终止程序以及查询程序状态等)。
- AdminService:处理管理员的请求(更新节点 / ACL列表、更新队列信息等),防止大量的普通用户请求导致管理命令饿死。
- WebApp:通过 Web 页面展示集群资源使用情况和程序使用情况。
3.2 NM 管理模块
- NMLivelinessMonitor:监控 NM 状态。若没有定期(默认10min)汇报心跳,则从集群中移除。
- NodesListManager:维护正常节点和异常节点列表。两个列表都是在配置文件中设置的,可动态加载。
- ResourceTrackerService:处理 NM 的请求。
3.3 AM 管理模块
- AMLivelinessMonitor:监控 AM 状态。若没有定期(默认10min)汇报心跳,则认为它死掉了,它上面运行的 Container 都被置为失败状态。AM 会被重新分配到另一个节点上执行(用户指定重试次数,默认为 2)。
- ApplicationMasterLauncher:与 NM 进行通信,下发命令启动
ApplicationMaster
。 - ApplicationMasterService(
AMS
):处理来自 AM 的请求。- 注册:
ApplicationMaster
启动节点对外 RPC 端口号和 Tracking URL 等信息。 - 心跳:汇报所需资源描述、待释放的 Container 列表、黑名单列表等。返回值是新分配的 Container、失败的 Container、待抢占的 Container 列表等信息。
- 注册:
3.4 Application 管理模块
- ApplicationACLsManager:管理应用程序访问权限。
- 查看权限:查看应用程序基本信息。
- 修改权限:修改程序优先级、杀死应用进程等。
- RMAppManager:管理应用程序的启停。
- ContainerAllocationExpirer:决定 Container 是否被回收以及执行。当 AM 收到 RM 新分配的 Container 后,必须在一定时间内(默认10min)在对应的 NM 启动该 Container,否则 RM 将强制回收该 Container。
3.5 状态机模块
- RMApp:维护一个应用程序的生命周期。
- RMAppAttempt:维护 RMApp 产生的小任务生命周期。
- RMContainer:维护 Container 的生命周期。目前的 Container 不支持重用,看看后期是否可重用。
- RMNode:维护 NodeManager 的生命周期。
3.6 安全模块
由以下子模块组成:
- ClientToAMSecretManager
- ContainerTokenSecretManager
- ApplicationTokenSecretManager
3.7 资源分配模块
ResourceScheduler:负责将资源分配给应用程序
- 批处理资源调度器:
FIFO
- 多用户调度器:
Fair Scheduler
和Capacity Scheduler
4.模块详解
4.1 用户交互模块
ClientRMService 和 AdminService 两个服务分别处理普通用户和管理员的请求。
- ClientRMService:本质是 RPC Server(实现 ApplicationClientProtocol),给客户端提供 RPC 服务。ClientRMService 中保留了 RM 上下文对象 RMContext,中央异步调度器(
AsyncDispatcher
)通过 RMContext 来获取节点列表、队列组织和应用列表等信息来响应客户端请求。 - AdminService:本质也是RPC Server,不过服务对象是管理员。yarn.admin.acl设置的,默认是*,表示所有用户都是管理员
4.2 NM 管理模块
由以下三个组件共同组成
- NMLivelinessMonitor
- 当前正在运行的 NM 会保存在 RM 的一个数据结构中,NMLivelinessMonitor 就周期遍历,若一个 NM 在一定时间(默认10分钟)未汇报心跳,则认为其挂了。
- 心跳周期(默认十分钟):
yarn.nm.liveness-monitor.expiry-interval-ms
- NodesListManager:管理 RM 的节点
- 指定白名单文件:
yarn.resourcemanager.nodes.include-path
- 指定黑名单文件:
yarn.resourcemanager.nodes.exclude-path
- 再执行以下命令让配置生效
bin/yarn rmadmin -refreshNodes
- 指定白名单文件:
- ResourceTrackerService
- 本质是 RPC Server,处理 NM 请求(通过 ApplicationMasterProtocol 协议)。
- 注册(单次):NM 启动时发送该请求,携带节点 ID、可用资源的上限和对外开放的 HTTP 端口。
- 心跳(周期):包含运行的 Application 列表、节点健康状况和 Container 运行状态等。返回待释放的 Container 列表、Application 列表。
4.3 AM 管理模块
由以下三个组件共同组成:
- ApplicationMasterLauncher:既是服务也是事件处理器,响应 AMLauncherEvent 事件(启动 / 清理 AM)
- 启动 AM。通过 ContainerManagementProtocol 跟 NM 通信,将启动 AM 所需的信息如启动命令、JAR 包、环境变量等信息封装成 StartContainerRequest 对象发送给 NM。
- 清理 AM。通过 ContainerManagementProtocol 跟 NM 通信,要求其杀死 AM。
- ApplicationMasterService:负责跟 AM 通信,处理 AM 的请求(通过 ApplicationMasterProtocol 协议)
- 注册(单次):AM 启动时发送该请求,携带所在节点、RPC 端口和 Tracking URL 等信息。
- 心跳(周期):包含请求资源的类型、待释放的 Container 列表等。AMS 返回新分配的 Container、失败的 Container 等信息。
- 清理(单次):AM 向 RM 发送清理请求,来回收 / 清理各种资源。回收 AM 所占的 Container 和将 AM 从 AMLivelinessMonitor 中删除。
- AMLivelinessMonitor
- 周期性遍历所有 AM,如果有 AM 没有定期发送心跳则认为它挂了,它所持有的 Container 全部设置为失败。RM 会重新为它分配资源并在另一个节点上启动。
- 心跳时间(默认十分钟):
yarn.am.liveness-monitor.expiry-interval-ms
- AM 失败重试次数(默认两次):
yarn.resourcemanager.am.max-attempts
4.4 Application 管理模块
管理 Application 的生命周期、权限等。
- ApplicationACLsManager
- 管理应用程序查看 / 修改权限
- 通过该参数配置权限
yarn.admin.acl
- RMAppManager
- 负责应用程序的启停
- 将应用程序放到应用程序列表中
- 将应用程序从 RMStateStore 中移除
- 通过该参数设置最大应用数:
yarn.resourcemanager.max-completed-applications
- ContainerAllocationExpirer
- 管理 Container 的使用
- 如果某个 AM 拿到 Container 后一段时间内都没使用,则会强制回收(提高利用率)
- 等待时间 :
yarn.resourcemanager.rm.container-allocation.expiry-interval-ms
5.特点
事件驱动:中央异步调度器将组件 / 服务组织在一起,各个组件 / 服务的输出都是事件,组件 / 服务之间的交互都是通过事件,从而实现了异步并行的高效系统。