概述
中文叫资源调度器或资源分配器。一般只用CapacityScheduler这一种实现。可插拔。
一共三种实现:FIFO、Fair Scheduler、Capacity Scheduler。
CapacityScheduler支持功能最多使用最广泛。FifoScheduler功能最简单基本不可用。FairScheduler今年社区已明确不再继续支持。
YarnScheduler接口最重要是allocate方法。参数如下,其中ask请求资源列表、release待释放资源列表,其他添加删除黑名单节点。
ApplicationAttpemptId appAtemptId
ResourceRequest[] ask
ContainerId[] release
String blacklistAdditions
String blacklistRemovals
NODEUPDATE
RM收到NM心跳上报信息后会触发NODE_UPDATE事件。可能有新的容器释放。也就是说当前集群可用资源,以NM心跳触发的NODEUPDATE为准。和AM上报无关。会触发资源调度器最核心机制资源分配。
调度语义
支持语义:
指定节点或机架的几个同样Container;拉黑节点;归还资源(AM减持资源归还给集群)。
不支持语义:
任意节点或机架、一组不同类资源(请求俩节点,两节点容器配置不同)。
调度调度模型
双层调度模型:第一层,RM将资源分给AM。第二层,AM将资源分给内部任务。RM上的资源调度器只关心第一层。
pull-based通信模型:资源调度器把容器资源分给AM后暂存到缓冲区中,等AM下次心跳来拉取。
资源保障机制:当前资源不够时有两种机制:锁定一个节点等待释放支援充足(增量资源分配)。无锁定等待出现一个资源充足的节点(一次性资源分配)。Yarn采用增量资源分配,因为一次性资源分配可能出现饿死现象,即永远也等不到满足资源的节点出现,所以宁可减少资源利用率也采用第一种方式。
资源分配算法:Yarn采用主资源公平调度算法(Dominant Resource Fairness,DRF)该算法扩展了最大最小公平算法(Max-Min Fariness)。DRF中将所需份额最大的资源称为主资源,基本思想是在主资源上应用最大最小公平算法。
应用状态存储完成后,应用状态变为SUBMITTED;RMAppManager开始向ResourceScheduler提交应用,如果无法正常提交(例如队列不存在、不是叶子队列、队列已停用、超出队列最大应用数限制等)则抛出拒绝该应用,应用状态先变为FINAL_SAVING触发应用状态存储流程并在完成后变为FAILED;如果提交成功,应用状态变为ACCEPTED;
资源抢占模型
最小资源量不是硬性保障,当队列不需要任何资源时,并不会满足最小资源量,会把此队列资源分给其他需要的队列。当此队列需有新应用提交时,调度器将本属于它的资源归还,归还需要等待时间,如果超时,则发生抢占。
只有调度器实现PreemptableResourceScheduler接口且yarn.resourcemanager.scheduler.monitor.enable设置true(默认false)才开启抢占功能。
Capacity Scheduler
概述
处理心跳:NM心跳两类信息需要处理,新启动的容器和完成的容器。
新启动容器:调度器发送RMContainerEventType.LAUNCHED事件,从而使容器从超时监控队列中移除。
完成容器:回收
处理完心跳后调度器将资源分配给应用程序。
资源分配:AM资源请求ResourceRequestProto一共五个字段:优先级、节点或机架、资源量、容器个数、是否松弛(节点没有资源是否选择机架资源)
三级支援分配策略:队列、应用、容器。
队列:基于优先级深度优先遍历。优先级是资源利用率,已使用资源除以队列资源容量,父队列是子队列的和在相除。
应用:Capacity Scheduler按照提交时间(ApplicationID)找最早提交的。
容器:先按照优先级,再按照本地性(node local、rack local、no local)。
yarn.scheduler.caoacity.resource-calculator可以设置资源比较器
实现
应用程序初始化
资源调度
资源分配
实践
后台可视化
http://host:8088/cluster/scheduler 可以查看Scheduler当前信息。
命令
yarn queue -status
Queue Information :
Queue Name : default
State : RUNNING
Capacity : 100.0%
Current Capacity : .0%
Maximum Capacity : 100.0%
Default Node Label expression : <DEFAULT_PARTITION>
Accessible Node Labels : *
Preemption : disabled
Intra-queue Preemption : disabled