常见术语
Steady FairShare
- 公平调度使用分层队列,其中权重确定了一个队列能够获取得资源数,这个资源数就是稳定公平份额,计算公式如下

稳定公平份额是一个理论值,只是给用户展示了该队列理论上能获取这么多资源,但实际上FairScheduler进行资源调度或者抢占是不会参考这个值的
举个例子,目前Yarn总资源是12vCore和24G内存,共有三个租户分别对应三个Yarn队列develop/saler/qa,其中develop权重为2,其他两个都为1,根据权重计算稳定公平份额如下 | 队列 | 权重 | 稳定公平份额 | 稳定vCore份额 | 稳定Memory份额 | | :—-: | :—-: | :—-: | :—-: | :—-: | | develop | 2 | 50% | 6 | 12GB | | saler | 1 | 25% | 3 | 6GB | | qa | 1 | 25% | 3 | 6GB |
Instantaneous FairShare
队列也是分为两种队列的,一种是active queue 该队列中至少有一个任务正在运行。另一种就是inactive队列,该队列中没有任务运行,资源都是处于空闲状态
FairScheduler是有弹性队列的概念的,允许队列使用超过该稳定公平份额的资源,换句话说是允许active queue使用inactive queue的资源
瞬时公平份额就是基于active queue来计算的,计算公式如下

- 还是拿上面的例子,假设现在develop队列中有两个任务在跑,saler队列中有一个任务再跑,qa队列中没有运行的任务,瞬时公平份额如下 | 队列 | 权重 | 运行任务 | 瞬时公平份额 | 瞬时vCore份额 | 瞬时Memory份额 | | :—-: | :—-: | :—-: | :—-: | :—-: | :—-: | | develop | 2 | App1/App2 | 66.6% | 8 | 16GB | | saler | 1 | App3 | 33.3% | 4 | 8GB | | qa | 1 | N/A | 0% | 0 | 0GB |
Starvation and Preemption
饥饿和抢占两者关系紧密,只有队列或应用获得的资源远远少于需求资源也就是常说的饥饿,才会发生抢占
还是拿上面的案例说,目前qa队列是没有任务在跑的,所以是inactive queue,此时一个测试人员向该队列提交了一个任务,qa队列就会转换为active queue,三个队列的瞬时公平份额变成如下 | 队列 | 权重 | 运行任务 | 瞬时公平份额 | 已使用资源 | 是否饥饿 | | :—-: | :—-: | :—-: | :—-: | :—-: | :—-: | | develop | 2 | App1/App2 | 50% | 66.6% | N | | saler | 1 | App3 | 25% | 33.3% | N | | qa | 1 | App4 | 25% | 0% | Y |
可以注意到,由于develop和saler队列占用了所有的资源,导致qa队列需要等待这两个队列中的任务运行完毕才能回收资源
Fair Scheduler和Capacity Scheduler都提供了抢占功能,可以按照一定的策略 Kill掉这两个队列任务中的container,用于回收资源
Starvation
饥饿分类
饥饿有两种类型 一种是FairShare Starvation,另一种是MinShare Starvation
FairShare Starvation
以下几种情况会导致FairShare Starvation
- 应用任务有未满足的资源需求
- 队列中的应用任务资源使用量少于队列的Instantaneous FairShare
- 还与以下两个参数相关,如果在规定的时间内没有抢占到Instantaneous FairShare的百分之几也会标记为饥饿
FairShare Starvation还有比较重要的两个参数,如下 | 参数 | 作用 | | :—-: | :—-: | | defaultFairSharePreemptionTimeout | FairShare抢占超时时间 | | defaultFairSharePreemptionThreshold | FairShare抢占阈值 |
针对上述两个参数举个容易理解的例子,如果defaultFairSharePreemptionTimeout设置为5s,defaultFairSharePreemptionThreshold设置为0.8,这就意味着,如果开启抢占,并且满足上面的a&b条件,应用程序在5秒内没有抢到瞬时公平配额的80%,就标记为饥饿
还需要注意的是开启抢占并不是让应用任务或者队列获取全部的Instantaneous FairShare,只是用于保证当前队列有足够的资源运行任务不至于被饿死
MinShare Starvation
以下几种情况会导致MinShare Starvation
- 队列中有一个或多个应用任务资源需求没有得到满足
- 队列资源的使用量小于配置的minResource
- 如果在规定的时间内,该队列抢占的资源还是没有达到minResource也会被标记为饥饿
MinShare Starvation相关参数如下,默认情况下defaultMinSharePreemptionTimeout是不设置的,需要进行显示设置 | 参数 | 作用 | | :—-: | :—-: | | defaultMinSharePreemptionTimeout | MinShare抢占超时时间 |
当应用任务提交到处于MinShare Starvation状态的队列时,应用任务会在队列中按照资源需求进行排序,同时分配资源时会按照需求进行顺序分配
针对上面举个例子,假设有个队列设置了12G的minResources,但是这时候只有6G的资源能给这个队列使用,所以该队列就处于MinShare Starvation的状态,如果有四个应用任务提交到该队列资源需求分别为APP1-3G / APP2-2G / APP3-1G /APP4-0.5G,这时候资源分配会满足APP1/APP2/APP3 ,但APP4不会分到任何资源因为资源是按照需求顺序进行分配的
Preemption
启用抢占
进入CM管理页面 -> 点击YarnService -> 搜索yarn.scheduler.fair.preemption -> 选中启用抢占

搜索yarn.scheduler.fair.preemption.cluster-utilization-threshold,这个参数默认值是0.8,也就是Yarn资源使用率达到了80%才可以进行抢占,因为抢占低利用率的集群可能会导致Container进行不必要的变动,影响效率
抢占先决条件
应用任务所在的队列允许抢占
如果队列在被抢占后所拥有的资源比Instantaneous FairShare少,那么就不能被抢占
饥饿与抢占
简单点讲MinShare Starvation是不会影响抢占的,MinShare Starvation和FairShare Starvation通俗的说只是代表了饥饿程度,资源高于fairshare - 我赚了;资源低于fairshare但高于minshare,比上不足比下有余,可以忍;资源低于minshare,掀桌子打滚儿
其他说明
- 容量调度的抢占大致原理和公平调度一样,容量调度的抢占文章会集中在抢占时如何选择container以及抢占后对应用任务的影响
