概述

中文叫资源调度器或资源分配器。一般只用CapacityScheduler这一种实现。可插拔。
一共三种实现:FIFO、Fair Scheduler、Capacity Scheduler。
CapacityScheduler支持功能最多使用最广泛。FifoScheduler功能最简单基本不可用。FairScheduler今年社区已明确不再继续支持。

YarnScheduler接口最重要是allocate方法。参数如下,其中ask请求资源列表、release待释放资源列表,其他添加删除黑名单节点。

  1. ApplicationAttpemptId appAtemptId
  2. ResourceRequest[] ask
  3. ContainerId[] release
  4. String blacklistAdditions
  5. 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可以设置资源比较器

实现

应用程序初始化

应用提交到RM后,会向Capacity Scheduler

资源调度

资源分配

实践

后台可视化

http://host:8088/cluster/scheduler 可以查看Scheduler当前信息。

命令

  1. yarn queue -status
  2. Queue Information :
  3. Queue Name : default
  4. State : RUNNING
  5. Capacity : 100.0%
  6. Current Capacity : .0%
  7. Maximum Capacity : 100.0%
  8. Default Node Label expression : <DEFAULT_PARTITION>
  9. Accessible Node Labels : *
  10. Preemption : disabled
  11. Intra-queue Preemption : disabled