Hadoop集群中有三种做业调度算法,分别为FIFO,公平调度算法和计算能力调度算法
先来先服务(FIFO)
Hadoop中默认的调度器FIFO,它先按照做业的优先级高低,再按照到达时间的前后选择被执行的做业。
FIFO比较简单,hadoop中只有一个做业队列,被提交的做业按照前后顺序在做业队列中排队,新来的做业插入到队尾。一个做业运行完后,老是从队首取 下一个做业运行。这种调度策略的优势是简单、易于实现,同时也减轻了jobtracker的负担。可是它的缺点也是显然的,它对全部的做业都一视同仁,没 有考虑到做业的紧迫程度,另外对小做业的运行不利。
公平调度策略
这种策略在系统中配置了任务槽,一个任务槽能够运行一个task任务,这些任务就是一个大的做业被切分后的小做业。当一个用户提交多个做业时,每一个做业可 以分配到必定的任务槽以执行task任务(这里的任务槽能够理解为能够运行一个map任务或reduce任务)。若是把整个hadoop集群做业调度跟操 做系统的做业调度相比,第一种FIFO就至关于操做系统中早期的单道批处理系统,系统中每一个时刻只有一道做业在运行,而公平调度至关于多道批处理系统,它 实现了同一个时刻多道做业同时运行。因为linux是多用户的,如有多个用户同时提交多个做业会怎样?在这种策略中给每一个用户分配一个做业池,而后给每一个 做业池设置一个最小共享槽个数,什么是最小共享槽个数呢?先要理解一个最小什么意思,最小是指只要这个做业池须要,调度器应该确保可以知足这个做业池的最 小任务槽数的需求,可是如何才能确保在它须要的时候就有空的任务槽,一种方法是固定分配必定数量的槽给做业池不动,这个数量至少是最小任务槽值,这样只要 在做业池须要的时候就分配给它就好了,可是这样在这个做业池没有用到这么多任务槽的时候会形成浪费,这种策略其实是这样作的,看成业池的需求没有达到最 小任务槽数时,名义上是本身的剩余的任务槽会被分给其余有须要的做业池,当一个做业池须要申请任务槽的时候若系统中没有了,这时候不会去抢占别人的(也不 知道抢谁的啊),只要当前一个空的任务槽释放会被当即分配给这个做业池。
在一个用户的做业池内,多个做业如何分配槽这个能够自行选择了如FIFO。因此这种调度策略分为两级:
第一级,在池间分配槽,在多用户的状况下,每一个用户分配一个做业池。
第二级,在做业池内,每一个用户能够使用不一样的调度策略。
计算能力调度
计算能力调度和公平调度有点相似,公平调度策略是以做业池为单位分配任务槽,而计算能力调度是以队列为单位分配tasktracker(集群中一个节 点),这种调度策略配置了多个队列,每一个队列配置了最小额度的tasktracker数量,同公平调度策略相似,当一个队列有空闲的 tasktracker时,调度器会将空闲的分配给其余的队列,当有空闲的tasktracker时,因为这时候可能有多个队列没有获得最小额度的 tasktracker而又在申请新的,空闲的tasktracker会被优先分配到最饥饿的队列中去,如何衡量饥饿程度呢?能够经过计算队列中正在运行 的任务数与其分得的计算资源之间的比值是否最低来判断的,越低说明饥饿程度越高。
计算能力调度策略是以队列的方式组织做业的,因此一个用户的做业可能在多个队列中,若是不对用户作必定的限制,极可能出如今多个用户之间出现严重不公平的现象。因此在选中新做业运行时候,还须要考虑做业所属的用户是否超过了资源的限制,若是超过,做业不会被选中。
对于在同一个队列中,这种策略使用的是基于优先级的FIFO策略,可是不会抢占。linux