这是我参与「第四届青训营 」笔记创作活动的第17天。
课程回顾
资源和调度主要解决大规模集群中资源管理和任务调度相关问题;
本模块主要讲解两个系统:
- 主要针对离线业务场景: Hadoop YARN
- 主要针对在线服务场景:Kubernetes
课程本节课程主要分为四个方面进行阐释:
-
YARN 概述:从食堂分配座位场景导入,初识调度系统;介绍调度系统发展的背景、解决的问题、目标和范型;Hadoop YARN 的设计思想和整体架构;
-
核心模块:对 YARN 中两个核心模块 Resource Manager 和 Node Manager 进行详细阐释,介绍其整体架构、主要职责、核心功能;
-
重要机制:介绍 YARN 在调度公平性保障的重要调度策略:Fair Share 和 DRF 调度策略;介绍 YARN 系统内部的事件机制和高可用机制;
-
公司实践:介绍字节跳动在调度功能、调度性能和集群利用率提升方面的工作,包括:Gang 调度器、反调度器、单集群规模突破 50K;
YARN 概述
调度系统认识
调度系统演变
调度系统演变-调度系统解决的问题
用有限资源解决有限资源无法满足的需求是就需要调度
调度系统主要解决资源请求和可用资源间的映射问题
调度系统演变-调度系统预达的目标
-
严格的多租户间公平、容量保障
-
调度过程的高吞吐与低延迟
-
高可靠性与高可用性保障
-
高可扩展的调度策略
-
高集群整体物理利用率
-
满足上层任务的个性化调度需求
-
任务持续、高效、稳定运行
-
We want to have all of them… However…
调度系统范型
YARN设计思想
- Hadoop 2.0 时代:解决了 Hadoop 1.0 时代中 HDFS 和 MR 中存在的问题:
-
YARN(MR v2) 在 MR v1 的基础上发展而来,将资源管理和任务控制解耦,分别由 Resource Manager 和 ApplicationMaster 负责,是一个两层调度系统;
-
Hadoop YARN(Yet Another Resource Negotiator) 支持多种计算框架的统一资源管理平台;
离线调度生态介绍
-
用户逻辑层:数据分析任务、模型训练任务等
-
作业托管层:管理各种类型上层任务
-
分布式计算引擎层:各种针对不同使用场景的计算引擎,例如:MR、Spark、Flink 等
-
集群资源管理层:YARN
-
裸金属层:众多物理节点组成
YARN 面临的挑战
-
- 公平性:各租户能够公平的拿到资源运行任务
-
- 高性能:高调度吞吐、低调度延迟,保障资源快速流转
-
- 高可用:集群要具备很强的容错能力
-
- 单集群规模提升:原生 YARN 单集群仅支持 5K
-
- 高集群资源利用率
-
- 高任务运行质量保障
YARN整体架构 -系统架构
上图为 YARN 架构,主要包含两大角色:
-
Resource Manager
- 整个集群的大脑,负责为应用调度资源,管理应用生命周期;
- 对用户提供接口,包括命令行接口,API, WebUI 接口;
- 可以同时存在多个RM、,同一时间只有一个在工作,RM 之间通过 ZK 选主;
-
Node Manager
- 为整个集群提供资源, 接受 Container 运行;
- 管理Contianer的运行时生命周期, 包括Localization, 资源隔离, 日志聚合等;
任务运行生命周期核心流程
client发送请求,RM 负责将请求任务解析通过与NM交互,将任务的数据存储在HDFS中,然后在RM注销任务
YARN核心模块
整体架构
YARN基于事件处理的,所以需要RMA
RM 负责集群所有资源的统一管理和分配,接收各节点汇报信息并按照一定策略分配给各个任务;
-
与客户端交互,处理来自客户端的请求
-
启动和管理 AM,运行失败时自动重试
-
管理所有 NM,接收 NM 的汇报信息并下达管理指令
-
资源管理与调度
- 将资源按照一定方式组织起来,例如:资源池
- 将任务按照一定方式组织起来,例如:队列
- 接收来自各个 AM 的资源请求
- 按照一定分配策略将资源分配给 AM
状态机管理
RMApp状态机
-
NEW_SAVING: 收到提交的应用程序后,创建 RMAppImpl 对象并将基本信息持久化;
-
ACCEPTED:调度器接受该应用程序后所处的状态,任务等待被分配资源;
-
RUNNING:任务成功获取到资源并在节点运行
RMAppAttempt
RMContainer
-
RESERVED: 开启资源预留时,当前节点不能满足资源请求时所处的状态;
-
ALLOCATED:调度器分配一个 Container 给 AM;
-
ACQUIRED:AM 获取到分配的 Container 后所处的状态;
-
EXPIRED: AM 获取到 Container 后,若在一定时间内未启动 Container,RM 会强制回收该 Container;
RMNode
-
DECOMMSIONED: 节点下线后的状态;
-
UNHEALTHY:节点处于不健康状态,健康检测脚本异常或磁盘故障;
-
LOST:超过一定时间(默认 10 分钟)未与 RM 发生心跳后所处的状态;
调度流程: YARN 调度流程由心跳触发:
-
AM 定期与 RM 保持心跳,并将资源请求记录在 RM 中;
-
触发时机: 由节点心跳触发针对此节点的调度;
-
找 Label: 根据节点 Label 找到对应 Lable 下的所有队列;
-
找队列: 将队列进行 DRF 排序, 找到当前最“饥饿”的队列;
-
找应用: 将此队列内所有应用按照优先级进行排序(优先级由用户提交时指定), 找到优先级最高的应用, 优先级相同时按DRF 算法排序;
-
找资源请求: 将此应用内的所有资源请求按照优先级排序(优先级由计算引擎指定), 找到优先级最高的资源请求进行资源分配;
- 典型调度器对比
Node Manager
主要职责
总的来说,NM 是节点代理,从 AM 接受命令(启停 Container)并执行,通过心跳方式向 RM 汇报节点状态并领取命令(清理 Container)。
-
与 RM 交互
- 心跳汇报节点健康状况和 Container 运行状态;
- 领取 RM 下达的命令;
-
与 AM 交互
- 启动容器
- 停止容器
- 获取容器状态
状态机管理
Application
-
INITING: Application 初始化状态,创建工作目录和日志目录;
-
FINISHING_CONTAINERS_WAIT:调等待回收 Container 所占用的资源所处的状态;
-
APPLICATION_RESOURCE_CLEANINGUP:Application 所有 Container 占用的资源被回收后所处的状态;
Container
-
LOCALIZING: 正在从 HDFS 下载依赖的资源;
-
EXITED_WITH_SUCCESS:Container 运行脚本正常退出执行;
-
CONTAINER_CLEANUP_AFTER_KILL:Container 被 kill 后所处的状态;
LocalizedResource
-
DOWNLOADING: 资源处于下载状态;
-
LOCALIZED:资源下载完成;
-
FAILED:资源下载失败;
重要机制
公平性保障
Fair Share 调度策略
什么是 Fair Share 调度策略?
队列配置 minShare 和 maxShare,当队列空闲时按照一定策略将资源分配给其他活跃队列;
为什么需要 Fair Share 调度策略?
保障公平的前提下实现队列间资源共享,提高资源利用率,缓解繁忙队列压力;
两种类型 Fair Share
- Steady Fair Share: TotalResource * S.weight
-
Instantaneous Fair Share:
-
定义
- 所有队列 Fair Share 之和 <= TotalResource;
- S.minShare <= Fair Share <= S.maxShare;
-
目标
- 找到一个 R 使其满足:
- R * (All S.wieght)<= TotalResource;
- S.minShare <= R * S.weight <= S.maxShare;
-
结果
- 若 S.minShare > R * S.weight, Fair Share = S.minShare
- 若 S.maxShare < R * S.weight,Fair Share = S.maxShare
- 其他 Fair Share = R * S.weight
-
Fair Share 计算逻辑
- 计算 Total Resource
-
初始化 R 上限 RMax
- 获取所有 non-fixed Schedulable 的 maxShare
- 初始化 R 为 1,每次翻倍
- 直到所有 Schedulable 分完所有资源
-
通过二分法寻找 R [0,RMax]
- mid = (left + right) / 2.0
- 若 plannedResourceUsed == totalResource,right = mid;
- 若 plannedResourceUsed < totalResource,left = mid;
- 若 plannedResourceUsed > totalResource,right = mid;
-
计算 Fair Share
- 若 S.minShare > right * S.weight, Fair Share = S.minShare;
- 若 S.maxShare < right * S.weight, Fair Share = S.maxShare;
- 其他情况 Fair Share = right * S.weight
DRF 调度策略
为什么需要 DRF 调度策略?
在保证公平性的前提下进行资源降维,以达到更好的分配效果;
什么是 DRF 调度策略?
-
DRF 是最大最小公平算法在多维资源上的具体实现;
-
旨在使不同用户的“主分享量”最大化的保持公平;
最大最小公平算法:最大化最小资源需求的满足度
-
资源按照需求递增的顺序进行分配;
-
用户获取的资源不超过自身需求;
-
对未满足的用户,等价分享剩余资源;
DRF核心算法说明
R 表示总资源量,有 m 个维度
C 已经使用的资源量
si 用户 i 的“主分享量”
Ui 分配给用户 i 的资源量
-
选择最小“主分享量”用户 i
-
Di 用户 i 下一个任务资源需求量
-
若资源充足
- 更新已使用资源量
- 更新用户 i 的已分配资源量
- 更新用户 i 的“主分享量
高性能保障
状态机管理
- 状态机由一组状态(初始状态、中间状态和最终状态)组成,状态机从初始状态开始运行,接收一组特定事件,经过一系列中间状态后,到达最终状态并退出;
- 每种状态转换由一个四元组表示:转换前状态、转换后状态、事件和回调函数;
- YARN 定义了三种状态转换方式如下所示:
事件处理模型
YARN 采用了基于事件驱动的并发模型,具有很强的并发性可提高系统性能。
-
RM 中所有处理请求都会作为事件进入系统;
-
AsyncDispatcher 负责传递事件给相应事件调度器--EventHandler;
-
事件调度器可能将该事件转发给另外一个事件调度器或带有有限状态机的事件处理器;
-
处理结果也以事件形式输出,新事件会再次被中央异步调度器转发给下一个事件调度器,直至处理完成。
总结
- 学习了YARN整体架构以及工作流程
- 学习了核心调度以及状态机管理
标题:走进 Yarn 资源管理和调度 | 青训营笔记
网址:juejin.cn/