现在的位置: 首页 > 综合 > 正文

Hadoop的作业调度算法总结

2018年04月20日 ⁄ 综合 ⁄ 共 2436字 ⁄ 字号 评论关闭

       当前,应用比较广泛的Hadoop作业调度算法包括:FIFO调度算法、Yahoo公司研发的计算能力调度(Capacity Scheduler)算法和Facebook公司研发的公平份额调度(Fair Scheduler)算法。

(1)先入先出调度算法

      Hadoop最早应用时,处理的业务通常是单用户提交的大型批处理作业,因此作业调度器采用了先入先出(First In First Out)调度算法。该算法的实现原理是:系统将所有用户提交的作业按照提交的先后顺序送入唯一的作业队列中,JobTracker调度作业时按照队列中的顺序选择作业,为其分配Slot。

(2)计算能力调度算法

      计算能力调度算法是Yahoo公司研发的调度算法。在计算能力调度算法中,可以定义多个作业队列。当作业被提交时,它将被直接放入到一个队列中。每个队列都可以通过配置获得一定数量的TaskTracker资源,调度算法将按照配置文件为队列分配相应的计算资源量。为了提高资源利用率,对于已经被分配但是尚处于空闲状态的资源,各个队列会分享它们。当没有能够按照设定数值获得足够资源量的队列增加了作业压力时,之前那些曾经分配给它但又被其他队列所占用的资源会在完成当前任务后立即返回它应属的队列。

      计算能力调度算法最关键的是如何挑选合适的作业去执行。当系统中出现了空闲的TaskTracker,算法会首先选择一个具有最多空闲空间的队列。选择一个队列后,计算能力调度算法在每个队列中采用的策略是带有优先级的FIFO 算法,优先级高的作业可以在优先级低的作业之前访问队列资源。在选择作业的时候,还需要关注作业所属的用户是否已经超出了他所能使用的资源限制,如果是的话那么相关作业都不能被选中。计算能力调度算法不支持优先级抢占,一旦一个作业开始执行,那么在执行完之前它所使用的资源是不会被更高优先级的作业夺走的。另外,计算能力调度算法对队列中同一用户提交的作业能够获得的资源百分比进行了强制限定。

       此外,计算能力调度还能够有效地对 Hadoop 集群的内存资源进行管理,以支持内存密集型应用。如果一个作业对内存资源需求较高,那么调度算法就要保证将该作业的相关任务指派到具有充足内存资源的TaskTracker 上执行,以避免任务由于内存资源不足而无法执行。

(3)公平调度算法

       公平调度算法(Fair Scheduler)是由 Facebook 提出的作业调度算法,它的目标是使 Hadoop MapReduce 计算框架能够应对多种类型作业的并行执行。

       公平算法的设计思想是尽可能保证所有的作业都能够获得等量的资源份额。当系统中只有一个作业执行时,它将独占整个集群并使用所有的计算资源。而一旦有其他的作业被提交,就会有TaskTracker被释放并分配给新提交的作业,以保证所有的作业都能够获得大体相同的计算资源量。这就使得短作业能够在合理的时间内完成,同时又不会有长作业长期处于饥饿状态。

       除了提供公平共享方法外,公平算法允许赋给作业池保证(guaranteed)最小共享资源。当一个作业池包含作业时,它至少能获取到它的最小共享资源,但是当作业池不完全需要它所拥有的保证共享资源时,额外的部分会在其它作业池间进行切分。

       在实际应用中,无论是作业池还是作业,都可以被赋予一定的权值并以此为依据获得相应比例的资源额度。在这种情况下,虽然作业池/作业在分享资源时不再是严格的平均分配,但是这更有利于根据用户/作业的重要程度及其实际计算需要合理地分配资源。这将有利于减少交互型作业的响应时间。

       公平调度算法会调度运行所有的用户作业,但它也可以限制在每个作业池中能够运行的作业数量。这一点是非常重要的,因为如果一次性地运行太多的作业,会导致在MapReduce计算过程中产生过多的中间记录信息以及过多的上下文切换,这都会影响作业执行的性能。对作业池中的作业数进行限定并不会使用户提交的后续作业在执行时失败,这些作业将在调度队列中等待早先的作业执行完成。在缺省情况下,在每个作业池中对作业执行的选择是首先按照优先级高低,然后再按照提交时间先后进行排序的。

       在公平调度算法的具体实现中,有两个关键:一是如何计算每一个作业的公平份额;另一个就是当有TaskTracker空闲时应该选择执行哪个作业。

       公平份额的计算是根据作业的权值将集群的资源总量划分给各个运行的作业。在缺省的情况下,作业权值的设定是基于优先级的,即每当作业的优先级升高一级,那么相应的作业权值就增加一倍。不过在公平调度算法中,作业权值的定义是可以配置的。类似的,作业池的最低资源保障也是按照权值比例分配给它所包含的各个作业。

       为了选择合适的作业执行,公平调度算法会跟踪每一个作业的赤字,即一个作业在理想情况下应该获得的计算资源量(主要是计算时间)与它实际获得的计算资源量之间的差距。赤字是衡量作业调度是否公平的重要指标,如果一个作业的赤字越大,说明它在之前受到的不公平待遇越多。公平调度算法会周期性地观察各个作业中有多少任务已在上一个时间段内执行,并将该结果与它应得的资源份额作对比以更新该作业的赤字值。一旦有空闲的TaskTracker出现,它会被首先分配给当前具有最高赤字的作业使用。这其中也会出现例外,如果在系统中存在着尚未获得最低资源保障的作业池,那么从属于它的作业将会被优先调度,当然这些作业之间的选择也需要根据它们的赤字值,这样做的目的是尽可能让作业池获得能够满足其最低保障的资源份额。

       抢占是通过定期检查是否有作业的资源低于其最小共享资源或低于其公平共享资源的一半,如果一个作业的资源低于其共享资源的时间足够长,它将被允许去结束其它作业的任务。所结束的任务是所有作业中那些最近运行起来的任务,以最小化被浪费的计算。

       参考文献:《Hadoop平台下的作业调度算法研究与改进》,华南理工大学,夏祎,硕士论文

抱歉!评论已关闭.