这是我参与「第四届青训营」笔记创作活动的第16天
0 引言
主要针对离线业务场景:Hadoop YARN
主要针对在线服务场景:Kubernetes
1 YARN概述
1.1 初识调度系统
调度系统就是多个应用 共用 多个类似于存储系统等(多对多的调用),达到高可用调度,提高资源利用率。
1.2 调度系统演进
用有限资源解决有限资源无法满足的需求时就需要调度。
调度系统主要解决资源请求和可用资源间的映射(Mapping)问题。
多个应用框架共享资源管理器时,严格的多租户间公平容量保障、调度过程的高吞吐与低延迟、高可靠性与高可用性保障、高可扩展的调度策略、高集群整体物理利用率、满足上层任务的个性化调度需求、任务持续高效稳定运行。
集中式 -> 两层式 -> 共享状态式 -> 分布式 -> 混合式
1.3 YARN设计思想
1.4 YARN整体架构
Resource Manager:资源管理和调度任务生命周期管理对外进行交互。
Node Manager:提供集群资源,管理Container运行。
2 核心模块
2.1 Resource Manager
主要职责
RM负责集群所有资源的统一管理和分配,接收各节点汇报信息并按照一定策略分配给各个任务。
与客户端交互、启动和管理所有AM、管理所有NM、资源管理与调度(组织资源-资源池、组织任务-队列、接收资源请求、分配资源)。
状态机管理-RMApp状态机
NEW SAVING:收到任务后,创建RMApplmpl对象并将基本信息持久化;
ACCEPTED:调度器接受该任务后所处的状态,任务等待被分配资源;
RUNNING:任务成功获取到资源并在节点运行;
状态机管理-RMAppAttempt
SCHEDULED:通过合法性检查后所处的状态,开始为该任务分配资源;
ALLOCATED_SAVING:收到分配的Container后,在持久化完成前所处的状态; ALLOCATED:信息持久化完成后所处的状态;
LAUNCHED: RM的ApplicationMasterLauncher 与NM通信以启动AM时所处的状态;
状态机管理-RMContainer
RESERVED:开启资源预留时,当前节点不能满足资源请求时所处的状态;
ALLOCATED:调度器分配一个 Container 给AM;
ACQUIRED:Container 被AM领走后的状态;
EXPIRED:AM获取到Container后,若在一定时间内未启动Container,RM会强制回收该Container;
状态机管理-RMNode
DECOMMISSIONED:节点下线后的状态;
UNHEALTHY:节点处于不健康状态,健康检测脚本异常或磁盘故障;
LOST:节点超过一定时间(默认10分钟)未与RM发生心跳后所处的状态;
调度器-任务/资源组织
任务按队列组织、节点按Label组织
调度器-调度流程
AM与RM心跳:记录资源请求
触发时机:节点心跳
找Label:获取所有队列
找队列:最“饥饿”队列优先
找任务:优先级高的任务优先
找资源请求:优先级高的请求优先
典型调度器
2.2 Node Manager
主要职责
NM是节点代理,从AM接受命令(启停Container)并执行,通过心跳方式向RM汇报节点状态并领取命令(清理Container) 。
与RM交互:心跳汇报节点状态、领取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:资源下载失败;
节点健康检测机制
这种机制可以让RM时刻检测NM的健康情况,根据此决定调度任务。
在自定义Shell中NodeHealthScriptRunner周期检测脚本,日志输出“ERROR”开头不健康。
检测磁盘的损坏数目中LocalDirsHandlerService周期检测NM本地磁盘好坏(有读/写/执行权限正常)。
3 重要机制
3.1 调度策略
Fair Share调度策略:队列空闲时按照一定策略将资源分配给其他活跃队列。
DRF调度策略:DRF是最大最小公平算法(最大最小公平算法:最大化最小资源需求的满足度。资源按照需求递增顺序分配;获取的资源不超过自身需求;未满足用户等价分享剩余资源)在多维资源上的具体实现,旨在使不同用户的“主分享量”最大化的保持公平。
3.2 事件机制
状态机管理
状态机由一组状态(初始状态、中间状态和最终状态)组成,状态机从初始状态开始运行,接收一组特定事件,经过一系列中间状态后,到达最终状态并退出。
每种状态转换由一个四元组表示:转换前状态、转换后状态、事件和回调函数。
YARN定义了三种状态转换方式如下所示:
事件处理模型
所有处理请求都会作为事件进入系统;
AsyncDispatcher负责传递事件给相应事件调度器;
事件调度器将事件转发给另一个事件调度器或带有有限状态机的事件处理器;
处理结果以事件形式输出,新事件会再次被转发,直至处理完成;
YARN采用了基于事件驱动的并发模型,具有很强的并发性可提高系统性能。
3.3 容错机制(高可用性)
RM高可用
热备方案:Active Master 提供服务、Standby Master 作为备节点;
基于共享存储的HA解决方案:关键信息写入共享存储系统(ZK);
两种切换模式:手动模式("yarn rmadmin"命令手动操作)。自动模式(ZK的ActiveStandbyElector进行选主操作,ZK中有一个锁节点,所有RM竞争写一个子节点,ZK保证最终只有一个RM能够创建成功,创建成功的为Active Master);
Client/AM/NM自动重试:切主时各组件采用round-robin方式尝试连接RM;
NM高可用
关键信息存储至leveldb数据库;
重启时从yarn-nm-recovery下的leveldb数据库加载数据。
4 公司实践
4.1 Gang调度器
批处理强调高吞吐,流式训练类型作业更强调低延迟和全局视角
全局视角:作业可自定义配置强弱约束、强约束必须要满足的条件、弱约束尽量满足的约束;
低调度延迟:RM维护所有节点状态信息、资源请求同步分配毫秒级返回;
Gang性资源交付:提供All-or-Nothing语义、可满足的请求全部分配否则返回失败;
Gang调度器调度流程
- 强约束阶段:过滤掉不符合条件的节点;
- 弱约束阶段:选择合适的节点分配资源(不排序,时间复杂度O(n))
- Quota平均:分配后节点已使用资源尽可能平均【总请求资源为V1,总节点数为N,已用资源为U,节点目标资源为:S =(V1 + U)/N,遍历所有节点,每个节点分配S - Un即可】
- 跳过高load节点:优先往低 load节点调度【满足load阈值节点N1,不满足N2,优先把N1剩余资源分配完,分配后未满足资源量为V2,每个节点分配V2/N2】
- 兜底分配
4.2 反调度器
调度器是分配资源,反调度器是在定资源下分配任务?
反调度流程
根据AM请求中的强约束,构造强约束集;
遍历强约束集选择不再符合强约束条件的节点;
遍历异常节点下的Container,选择需要进行反调度的Container;
将反调度Container列表随心跳返回给AM。
4.3 单集群规模50K
更好的资源池化和资源共享
降低运维成本
RPC层:接收请求、处理请求、返回结果
Dispatcher层:将事件传递给对应的事件调度器
Scheduler层:真正调度
心跳动态调整:将NM节点心跳周期改为根据RM的压力动态调整
多线程调度:对节点按hashcode 放到对应的Scheduler Queue
事件精简:对内部事件梳理调整,精准修改了一些事件处理逻辑
空转优化:调度时过滤不需要资源的App,减少空转
内存单位优化:修改内存单位(int -> long)突破单集群21亿MB限制
切主优化:通过对切主过程深度优化,将切主时间控制在秒级