12.5.2 Apache Mesos资源分配

Mesos中最核心的问题是如何构建一个兼具良好扩展性和性能的调度模型以支持各种计算框架。由于不同框架可能有不同的调度需求(这往往跟它的编程模型、通信模型、任务依赖关系和数据放置策略等因素相关),因此,为Mesos设计一个好的调度模型是一项极具挑战性的工作。

一种可能的解决方案是构建一个具有丰富表达能力的中央调度器。该调度器接收来自不同框架的详细需求描述,比如资源需求、任务调度顺序和组织关系等,然后为这些任务构建一个全局的调度序列。但是,在真实系统中,由于每种计算框架具有不同的调度需求,且有些框架的调度需求非常复杂,因此,提供一个具有丰富表达能力的API以捕获所有框架的需求是不太可能的,也就是说,该方案过于理想化,在真实系统中很难实现。

Mesos提供了一种简化的方案:将资源调度的控制授权给各个框架。Mesos负责按照一些简单的策略(比如FIFO, Fair等)将资源分配给各个框架,而框架内部调度器则根据一些个性化的需求将分配到的资源进一步分配给各个作业。考虑到Mesos缺少对各个框架的实际资源需求的了解,为保证框架能高效地获取到自己需要的资源,它提供了三个机制:

(1)资源拒绝

如果Mesos为某个框架分配的资源不符合它的要求,则框架可以拒绝接受该资源,直到出现满足自己需求的资源。该机制使得框架在复杂的资源约束条件下,还能够保证Mesos设计简单和具有良好的扩展性。

(2)资源过滤

每次发生资源调度时,Mesos-master均需要与Framework-scheduler进行通信,如果有些框架总是拒绝某些节点上的资源,那么额外的通信开销会使得调度性能变得低效。为避免不必要的通信,Mesos提供了资源过滤机制,允许框架只接收来自“剩余资源量大于L的Mesos-slave”或者“位于特定列表中的Mesos-slave”上的资源。

(3)资源回收

如果某个框架在一定的时间内没有为分配的资源返回对应的任务,则Mesos将回收为其分配的资源,并将这些资源重新分配给其他框架。

与YARN和Corona类似,Mesos也采用了基于真实资源需求量的调度模型。为了支持多维资源调度,Mesos采用了主资源公平调度算法(Dominant Resource Fairness, DRF)[1]。该算法扩展了最大最小公平(Max-Min Fairness)算法[2],使其能够支持多维资源的调度。由于DRF被证明非常适合应用于多资源和复杂需求的环境中,因此被越来越多的系统采用,包括Apache YARN[3]

在DRF算法中,将所需份额(资源比例)最大的资源称为主资源,而DRF的基本设计思想则是将最大最小公平算法应用于主资源上,进而将多维资源调度问题转化为单资源调度问题,即DRF总是最大化所有主资源中最小的。其算法伪代码如下:


function void DRFScheduler()

R←<r1,……,rm>;//m种资源对应的容量

C←<c1,……,cm>;//已用掉的资源,初始值为0

si(i=1..n);//用户(或者框架)i的主资源所需份额,初始化为0

Ui←<ui,1,……,ui, m>(i=1..n)//分配给用户i的资源,初始化为0

挑选出主资源所需份额si最小的用户i;

D i←{用户i的下一个任务需要的资源量};

if C+D i<=R then

//将资源分配给用户i

C←C+Di;//更新C

Ui←Ui+Di;//更新U

si=maxmj=1{ui, j/rj};

else

return;//资源全部用完

end if

end function


【实例】假设系统中共有9 CPUs和18 GB RAM,有两个用户(或者框架)分别运行了两种任务,需要的资源量分别为<1 CPU,4 GB>和<3 CPUs,1 GB>。对于用户A,每个任务要消耗总CPU的1/9(份额)和总内存的2/9,因而A的主资源为内存;对于用户B,每个任务要消耗总CPU的1/3和总内存的1/18,因而B的主资源为CPU。DRF将最大化所有用户的主资源,具体分配过程如表12-2所示。最终,A获取的资源量为<3 CPUs,12 GB>,可运行3个任务;而B获取的资源量为<6 CPUs,2 GB>,可运行2个任务。

12.5.2 Apache Mesos资源分配 - 图1

[1]Dominant Resource Fairness:Fair Allocation of Multiple Resources Types. A.Ghodsi, M.Zaharia, B.Hindman, A.Konwinski, S.Shenker, and I.Stoica, NSDI 2011,March 2011

[2]Max-Min Fairness(Wikipedia):http://en. wikipedia.org/wiki/Max-min fairness

[3]https://issues. apache.org/jira/browse/YARN-2