在每个pool中,将其拥有的slot按作业的权重分配给各个作业(由步骤(1)完成),分完之后将剩余的slot按作业的权重和缺额分配给仍需slot的作业(由步骤(2)和(3)完成),如果还有slot剩余,则将这些slot共享给其他pool。
初始化:
当前所有作业的最小共享量置零;
pool的minMaps数或者minReduces数(由用户在配置文件中设定)
重复以下几步,直到slotsLeft=0:
(1)计算每个job的最小共享量:jobinfo.minMaps或jobinfo.minReduces
首先计算该作业可获得的共享值:
根据当前pool的剩余slot数,调整该共享值:
其中runnableNum表示作业尚需的slot数与正在运行的slot数之和,curMin表示作业的当前最小共享量(jobinfo.minMaps或jobinfo.minReduces),初始值为0。
将slotsToGive作为最小共享量赋予相应的job。
修改值为值减去slotsToGive。
如果此轮循环中,slotsLeft值未变,即没有slot分给任何作业,则将剩余的slot共享给pool中所有job,即,执行(2)(3)并结束算法:
(2)将pool中的job按weight和deficit排序
(3)按顺序依次计算每个job的最小共享量。
首先计算该作业可获得的共享值:
根据当前pool的剩余slot数,调整该共享值:
将slotsToGive作为最小共享量赋予相应的job。
修改slotsLeft值为slotsLeft值减去slotsToGive。
需要注意的是,当执行完(2)(3)后,slotsLeft可能仍大于0,这时候会将剩余的slotsLeft个slot共享给其他pool。
5) 更新公平共享量
主要思想:基于作业权重和最小共享量计算公平共享量。首先,根据权重分配可用slot数,如果作业的最小共享量大于公平共享量,先要满足最小共享量,更新可用slot数,重复以上步骤,直到所有作业的最小共享量小于或等于公平共享量,这样,每个作业的最小共享量都得到了满足,最后,所有作业平分剩下的slot数。
算法实现:
初始化:当前所有作业的公平共享量置零;slotsLeft={系统中map slot 或者reduce slot 总数};jobsLeft={系统中正在运行的作业}
(1)遍历集合jobsLeft中的所有作业,计算每个作业的jobFairShare: