YARN中用的作业调度算法:DRF(Dominant Resource Fairness)

     在Mesos和YARN中,都用到了dominant resource fairness算法(DRF),它不同于hadoop基于slot-based实现的fair scheduler和capacity scheduler,论文阅读:Dominant Resource Fairness: Fair Allocation of Multiple Resource Types 。
考虑在一个包括多种资源类型(主要考虑CPU和MEM)的系统的公平资源分配问题,其中不同用户对资源有不同的需求。为了解决这个问题,伯克利的几位大牛提出了Dominant Resource Fairness(DRF),一种针对不同资源类型的max-min fairness。并且在Mesos的设计和实现中评估了DRF,显示了它可以比slot-based 公平调度算法得到更好的吞吐量。

    DRF是一种通用的多资源的max-min fairness分配策略。DRF背后的直观想法是在多环境下一个用户的资源分配应该由用户的dominant share(主导份额的资源)决定,dominant share是在所有已经分配给用户的多种资源中,占据最大份额的一种资源。简而言之,DRF试图最大化所有用户中最小的dominant share。
举个例子,假如用户A运行CPU密集的任务而用户B运行内存密集的任务,DRF会试图均衡用户A的CPU资源份额和用户B的内存资源份额。在单个资源的情形下,那么DRF就会退化为max-min fairness。
DRF有四种主要特性,分别是:sharing incentive、strategy-proofness、Pareto efficiency和envy-freeness。
DRF是通过确保系统的资源在用户之间是静态和均衡地进行分配来提供sharing incentive,用户不能获得比其他用户更多的资源。此外,DRF是strategy-proof,用户不能通过谎报其资源需求来获得更多的资源。DRF是Pareto-efficient,在满足其他特性的同时,分配所有可以利用的资源,不用取代现有的资源分配。最后,DRF是envy-free,用户不会更喜欢其他用户的资源分配。

    考虑一个有9个cpu和18GB的系统,有两个用户:用户A的每个任务都请求(1CPU,4GB)资源;用户B的每个任务都请求(3CPU,1GB)资源。如何为这种情况构建一个公平分配策略?

    对于用户A,每个任务需要消耗的资源为<1/9,4/18>=<1/9,2/9>,所以A的dominant shares为内存,比例为2/9

    对于用户B,每个任务需要消耗的资源为<3/9,1/18>=<1/3,1/18>,所以B的dominant shares为cpu,比例为1/3

YARN中用的作业调度算法:DRF(Dominant Resource Fairness)_第1张图片

通过列不等式方程可以解得给用户A分配3份资源,用户B分配2份资源是一个很好的选择。

DRF的算法伪代码为:

YARN中用的作业调度算法:DRF(Dominant Resource Fairness)_第2张图片

使用DRF的思路,分配的过程如下表所示,注意,每一次选择为哪个资源分配的决定,取决于上次分配之后,目前dominant share最小的那个用户可以得到下一次的资源分配。

YARN中用的作业调度算法:DRF(Dominant Resource Fairness)_第3张图片

YARN中用的作业调度算法:DRF(Dominant Resource Fairness)_第4张图片

每次迭代都要选择一个用户为其分配资源,用户的选择办法:选择当前Si最小的用户。

Si:已经分配给用户i的主资源占这种资源总量的比例

    在这个例子中,用户A的CPU占总CPU 1/9,MEM占总MEM的 2/9,而用户B的CPU占1/3,MEM占2/9,所以A的主资源为内存,B的主资源为CPU。基于这点,DRF会最大化A的内存的最小化分配,并会最大化B的CPU的最小分配。

你可能感兴趣的:(YARN中用的作业调度算法:DRF(Dominant Resource Fairness))