Hadoop YARN主资源调度算法
来源:《Hadoop技术内幕: 深入解析YARN架构设计与实现原理》 (董西成) 第6章 资源调度器
为了支持多维资源调度,YARN资源调度器采用了主资源公平调度算法(Dominant Resource Fairness,DRF),该算法扩展了最大最小公平(max-min fairness)算法,使其能够支持多维资源的调度。由于DRF被证明非常适合应用于多资源和复杂需求的环境中,因此被越来越多的系统采用,包括Apache Mesos。
在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; Di ← {用户i的下一个任务需要的资源量}; if C + Di <= R then //将资源分配给用户i C ← C + Di; //更新C Ui ← Ui + Di; //更新U si = maxmj=1{ui,j/rj}; else return; //资源全部用完 end if end function
下面我们看一个实例。假设系统中共有9个CPU和18GB RAM,有两个用户(或者框架)分别运行了两种任务,需要的资源量分别为<1CPU,4GB>和<3CPU,1GB>。对于用户A,每个任务要消耗总CPU的1/9(份额)和总内存的2/9,因而A的主资源为内存;对于用户B,每个任务要消耗总CPU的1/3和总内存的1/18,因而B的主资源为CPU。DRF将最大化所有用户的主资源,具体分配过程如表6-1所示。最终,A获取的资源量为<3CPU,12GB>,可运行3个任务;而B获取的资源量为<6CPU,2GB>,可运行2个任务。
表6-1 DRF算法的调度序列