这个我一直处于看了忘,忘了看的过程,所以决定把总结写下。

在此之前,先提两个问题

  • 队列配置的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资源的使用量之和,使之接近于资源总量

 private static int resourceUsedWithWeightToResourceRatio(double w2rRatio, Collection<? extends Schedulable> schedulables) {
        int resourceTaken = 0;
        for (Schedulable sched : schedulables) {
            int share = computeShare(sched, w2rRatio);
            resourceTaken += share;
        }
        return resourceTaken;
    }

上述所说的主要方法

private static int computeShare(Schedulable schedulable, double w2rRatio) {
    double share = schedulable.getWeight() * w2rRatio;
    share = Math.max(share, schedulable.getMinShare());
    share = Math.min(share, schedulable.getMaxShare());
    return (int) share;
}

说完如何计算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。

另外还有一张图:

fair

或许可以参考这里In fair scheduler, Queue should not been assigned more containers when its usedResource had reach the maxResource limit

总结

这篇文档,断断续续写了很久,温故知新,能有让自己能有对FS调度有个较为全面的认识。