yarn基本架构(【深入浅出 Yarn 架构与实现】4-1 ResourceManager 功能概述)
前面几篇文章对 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 结构设计与实现原理》第五章创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!