这是我参与「第四届青训营 」笔记创作活动的第8天
2 YARN核心模块
对YARN中两个核心模块Resource Manager 和 Node Manager进行纤细的阐释,介绍其整体架构、主要职责、核心功能
2.1 Resource Manager
整体架构

RM整体架构如上图,因为需要进行集群里所有任务的管理,所以他管理着所有的AppMaster,最上面ApplicationMasterService和AM定期进行心跳的保持,来负责资源请求的一些处理,AMLivelinessMonitor监控每一个AM是否存活,ApplicationMasterLauncher负责AM的拉起。图中中间左部是一些UserService,提供外部访问,中间ResourceScheduler按照一定的策略对资源请求进行调度,YARN是基于事件机制进行处理,中间右面是维护的一些重要对象的状态机,最下面是对集群所有节点的维护,每个物理机上都会部署一个NodeManager。
主要职责
总的来说,RM 负责集群所有资源的统一管理和分配,接收各节点汇报信息并按照一定策略分配给各个任务;
-
与客户端交互,处理来自客户端的请求
-
启动和管理 AM,运行失败时自动重试
-
管理所有 NM,接收 NM 的汇报信息并下达管理指令
-
资源管理与调度
- 将资源按照一定方式组织起来,例如:资源池
- 将任务按照一定方式组织起来,例如:队列
- 接收来自各个 AM 的资源请求
- 按照一定分配策略将资源分配给 AM
状态机管理
- RMApp状态机
当一个任务提交上来之后状态进行流转

- NEW_SAVING: 收到提交的应用程序后,创建 RMAppImpl 对象并将基本信息持久化;
- ACCEPTED:调度器接受该应用程序后所处的状态,任务等待被分配资源;
- RUNNING:任务成功获取到资源并在节点运行
- RMAppAttempt状态机
一个任务可能会启动多个实例,每个实例会维护个RMAppAttempt状态

- SCHEDULED: 通过 Scheduler 合法性检查后所处的状态,开始为该 App 分配资源;
- ALLOCATED_SAVING:收到分配的 Container 后,在持久化完成前所处的状态;
- ALLOCATED:信息持久化完成后所处的状态;
- LAUNCHED:RM 的 ApplicationMasterLauncher 与 NM 通信以启动 AM 时所处的状态;
- RMContainer 状态机
每个任务都是以容器的状态进行的

- RESERVED: 开启资源预留时,当前节点不能满足资源请求时所处的状态;
- ALLOCATED:调度器分配一个 Container 给 AM;
- ACQUIRED:AM 获取到分配的 Container 后所处的状态;
- EXPIRED: AM 获取到 Container 后,若在一定时间内未启动 Container,RM 会强制回收该 Container;
- RMNode 状态机

- DECOMMSIONED: 节点下线后的状态;
- UNHEALTHY:节点处于不健康状态,健康检测脚本异常或磁盘故障;
- LOST:超过一定时间(默认 10 分钟)未与 RM 发生心跳后所处的状态;
调度流程
- AM 定期与 RM 保持心跳,并将资源请求记录在 RM 中;
- 触发时机: 由节点心跳触发针对此节点的调度;
- 找 Label: 根据节点 Label 找到对应 Lable 下的所有队列;
- 找队列: 将队列进行 DRF 排序, 找到当前最“饥饿”的队列;
- 找应用: 将此队列内所有应用按照优先级进行排序(优先级由用户提交时指定), 找到优先级最高的应用, 优先级相同时按DRF 算法排序;
- 找资源请求: 将此应用内的所有资源请求按照优先级排序(优先级由计算引擎指定), 找到优先级最高的资源请求进行资源分配;
典型调度器对比
