前面几篇文章对 Yarn 基本架构、程序基础库、应用设计方法等进行了介绍。之后几篇将开始对 Yarn 核心组件进行剖析。
ResourceManager(RM)是 Yarn 的核心管理服务,负责集群管理、任务调度、状态机管理等,本篇将对 RM 总体架构进行介绍。
一、RM 基本职能
主要包含以下几个功能:
- Client 交互:处理来自 Client 的请求;
- 管理 ApplicationMaster:启动、管理、重启等;
- 管理 Nodemanager:接收 NM 汇报的资源信息,并下达管理指令;
- 资源管理与调度:接收 AM 的资源请求,并分配资源。
如上图所示,RM 中各组件通过对应 RPC 与各 Client 进行通信:
- ResourceTrackerProtocol: NodeManager(NM)通过该 RPC 协议向 RM 注册、汇报节点健康状况和 Container 运行状态,并领取 RM 下达的命令。NM 与 RM 之间采用了「pull模型」,NM 总是周期性地主动向 RM 发起请求(心跳),并领取下达给自己的命令。
- ApplicationMasterProtocol: 应用程序的 ApplicationMaster 通过该 RPC 协议向 RM 注册、申请资源和释放资源。(AM 与 RM 交互参考上一篇文章「3-3 Yarn Application Master 编写」)
- ApplicationClientProtocol: 应用程序的客户端通过该 RPC 协议向 ResourceManager 提交应用程序、查询应用程序状态和控制应用程序(比如杀死应用程序)等。(AppClient 与 RM 交互参考文章「3-2 Yarn Client 编写」
从以上介绍中可以看出,与 RM 通过 RPC 通信的组件都采用「Pull 模型」,各个「Client」通过心跳定期向 RM 汇报,在心跳返回值中领取 RM 下达的指令。
二、RM 内部架构
本节将深入 RM 内部,看其内部组织结构和主要模块,架构图如下所示:
一)用户交互模块
RM 分别针对普通用户、管理员和 Web 提供了三种对外服务:
- ClientRMService: 为普通用户提供的服务,它处理来自客户端各种RPC请求,比如提交应用程序、终止应用程序、获取应用程序运行状态等;
- AdminService: RM 为管理员提供了一套独立的服务接口,以防止管理员发送的管理命令饿死,管理员可通过这些接口管理集群,比如动态更新节点列表、更新ACL列表、更新队列信息等;
- WebApp: 更加友好地展示集群资源使用情况和应用程序运行状态等信息。
二) NM 管理模块
- NMLivelinessMonitor: 监控 NM 是否活着,长时间(默认为10min)内未汇报心跳信息,则认为其挂了;
- NodesListManager: 维护正常节点和异常节点列表,管理exclude(类似于黑名单)和include(类似于白名单)节点列表,这两个列表均是在配置文件中设置的,可以动态加载;
- ResourceTrackerService: 处理来自 NM 的请求,主要包括注册和心跳两种请求。
三) AM 管理模块
- AMLivelinessMonitor: 监控AM是否活着,长时间未汇报心跳,它上面所有正在运行的 Container 将被置为失败状态,而 AM 本身会被重新分配到另外一个节点上执行(AM 重试次数默认是2);
- ApplicationMasterLauncher: 与某个 NM 通信,要求它为某个应用程序启动 ApplicationMaster;
- ApplicationMasterService(AMS): 处理来自 AM 的请求,主要包括注册和心跳两种请求。其中心跳汇报信息包含所需资源描述、待释放的Container列表、黑名单列表等,而 AMS 则为之返回相应的 Container 信息。
四) Application 管理模块
- ApplicationACLsManage: 管理应用程序访问权限,包含两部分权限:查看权限和修改权限;
- RMAppManager: 管理应用程序的启动和关闭;
- ContainerAllocationExpirer: 当 AM 收到 RM 新分配的一个 Container 后,必须在一定的时间内启动该 Container,否则将被回收。
五)状态机管理模块
RM 共维护四类状态机:
- RMApp: 维护一个 Application 的整个运行周期,可能会包括多次 Attempt;
- RMAppAttempt: 一个实例运行失败后,可能再次启动一个重新运行,而每次启动称为一次运行尝试用 「RMAppAttempt」描述,RMAppAttempt 维护了一次运行尝试的整个生命周期;
- RMContainer: 维护一个 Container 的运行周期。RM 将资源封装成 Container 发送给应用程序的 AM,而AM 则会在 Container 中启动任务;
- RMNode: 维护一个 NM 的生命周期,包括启动到运行结束整个过程。
六)安全管理模块
RM 有非常全面的权限管理机制,主要包括:
- ClientToAMSecretManager
- ContainerTokenSecretManager
- ApplicationTokenSecretManager
七)资源分配模块
该模块主要涉及一个组件「ResourceScheduler」。其是资源调度器,按照一定的约束条件(比如队列容量限制等)将集群中的资源分配给各个应用程序。
ResourceScheduler 是一个插拔式模块,自带三个调度器,用户可以自己定制:
- FIFO:先进先出,单用户
- Fair Scheduler:公平调度器(FairScheduler基本上具备其它两种的所有功能)
- Capacity Scheduler:容量调度器
此部分将在后面文章中更详细的介绍。
三、RM事件与事件处理器
Yarn采用了事件驱动机制,而RM是的实现则是最好的例证。所有服务和组件均是通过中央异步调度器组织在一起的,不同组件之间通过事件交互,从而实现了一个异步并行的高效系统。
下面是详细的表格:
四、小结
在 YARN 中,ResourceManager 负责集群中所有资源的统一管理和分配,它接收来自各个节点(NodeManager)的资源汇报信息,并把这些信息按照一定的策略分配给各个应用程序。
本篇对 ResourceManager 总体架构进行了介绍。对其基本职能、内部结构、处理的事件进行了梳理。后续文章中将会对每个部分深入源码进行更深入讨论。
参考文章:
《Hadoop 技术内幕 - 深入解析 Yarn 结构设计与实现原理》第五章