这个我一直处于看了忘,忘了看的过程,所以决定把总结写下。
在此之前,先提两个问题
- 队列配置的Max Resources加起来超过集群资源的总量时,会有什么影响?
- 队列使用的资源量不会超过我们设置的Max Resources?
我使用的版本是Apache hadoop 2.2.0,所以下都是基于该版本进行分析的。
在YARN中,我们都是通过队列的方式进行资源管理的,队列中可以建立子队列,队列可以通过配置不同的属性,包括提交权限,资源大小,权重等,对于FS来说,每个队列都被抽象成一个Schedulable,其计算过程就是给定一系列的Schedulable和一系列的slot,计算出他们的加权fairshare(weighted fair share)。
资源公平性计算
如果我们不设置minumum share和maximum share,加权fairshare的R = soltAssigned / weight(默认1),可以看出每个Schedulable都可以获得相同的资源量
在实际中,有些Schedulable可能会出现minShare高于他们设置的maxShare或者maxShare低于他们分配的share值,为了处理这些类似的问题,资源分配需要满足:
- 如果S.minShare > R*S.weight,则分配S.minShare
- 如果S.maxShare < R*S.weirht,则分配S.maxShare
- 其他则分配R*S.weight
主要计算实现:ComputeFairShares
基本原理:
- 0.首先计算每个schedulable的maxShare的值的和与totalResource比较,取最小值
- 1、rMax=1
- 2、计算当前的使用量U
- 3、如果U < TotalResource,则rMax = rMax*2,跳转2
- 定义left=0,right=rMax
- 4、mid =(left + right)/ 2
- 5、计算当前的使用量U
- 6、如果U<TotalResource,left = mid
- 7、否则right = mid
- 8、当前迭代次数<规定迭代次数,跳转4,否则退出
- 9、通过right值计算每个schedulable的FairShare
如何计算当前资源的使用量U,通过尝试w2rRatio的值,计算出每个schedulable资源的使用量之和,使之接近于资源总量
1 | private static int resourceUsedWithWeightToResourceRatio(double w2rRatio, Collection<? extends Schedulable> schedulables) { |
上述所说的主要方法
1 | private static int computeShare(Schedulable schedulable, double w2rRatio) { |
说完如何计算fairshare的基本流程,下面来讨论FairSharePolicy是如何对slot进行分配的
对于FairScheduler的FairSharePolicy机制,它采用的是DefaultResourceCalculator,即只对内存做资源计算,规则为通过比较两个Schedulable的加权fairShare(weighted fair sharing),那些低于minShare的Schedulable将会比那些高于minShare的拥有更高的优先级获取资源。
如果Schedulable都低于他们的minShare,则通过他们低于minShare的比例的多少来比较,例如,如果一个job A拥有8个task(minShare 10即比例为80%),job B拥有50个task(minShare 100即比例为50%),则job B将会有更高的优先级在下次资源分配时获取资源。
如果Schedulable在他们的minShare之上,则通过比较他们的(runningTasks/weight),如果所有的权重都相等,则slot资源需求少的job优先获得资源,另外,如果一个job拥有更高的权重则拥有机会获得多slot。
另外还有一张图:
总结
这篇文档,断断续续写了很久,温故知新,能有让自己能有对FS调度有个较为全面的认识。