6.3 作业调度机制

在0.19.0版本之前,Hadoop集群上的用户作业采用先进先出(FIFO, First Input First Output)调度算法,即按照作业提交的顺序来运行。同时每个作业都会使用整个集群,因此它们只有轮到自己运行才能享受整个集群的服务。虽然FIFO调度器最后又支持了设置优先级的功能,但是由于不支持优先级抢占,所以这种单用户的调度算法仍然不符合云计算中采用并行计算来提供服务的宗旨。从0.19.0版本开始,Hadoop除了默认的FIFO调度器外,还提供了支持多用户同时服务和集群资源公平共享的调度器,即公平调度器(Fair Scheduler Guide)和容量调度器(Capacity Scheduler Guide)。下面主要介绍公平调度器。

公平调度是为作业分配资源的方法,其目的是随着时间的推移,让提交的作业获取等量的集群共享资源,让用户公平地共享集群。具体做法是:当集群上只有一个作业在运行时,它将使用整个集群;当有其他作业提交时,系统会将TaskTracker节点空闲时间片分配给这些新的作业,并保证每一个作业都得到大概等量的CPU时间。

公平调度器按作业池来组织作业,它会按照提交作业的用户数目将资源公平地分到这些作业池里。默认情况下,每一个用户拥有一个独立的作业池,以使每个用户都能获得一份等同的集群资源而不会管它们提交了多少作业。在每一个资源池内,会用公平共享的方法在运行作业之间共享容量。除了提供公平共享方法外,公平调度器还允许为作业池设置最小的共享资源,以确保特定用户、群组或生产应用程序总能获取到足够的资源。对于设置了最小共享资源的作业池来说,如果包含了作业,它至少能获取到最小的共享资源。但是如果最小共享资源超过作业需要的资源时,额外的资源会在其他作业池间进行切分。

在常规操作中,当提交一个新作业时,公平调度器会等待已运行作业中的任务完成,以释放时间片给新的作业。但公平调度器也支持作业抢占。如果新的作业在一定时间(即超时时间,可以配置)内还未获取公平的资源分配,公平调度器就会允许这个作业抢占已运行作业中的任务,以获取运行所需要的资源。另外,如果作业在超时时间内获取的资源不到公平共享资源的一半时,也允许对任务进行抢占。而在选择时,公平调度器会在所有运行任务中选择最近运行起来的任务,这样浪费的计算相对较少。由于Hadoop作业能容忍丢失任务,抢占不会导致被抢占的作业失败,只是让被抢占作业的运行时间更长。

最后,公平调度器还可以限制每个用户和每个作业池并发运行的作业数量。这个限制可以在用户一次性提交数百个作业或当大量作业并发执行时用来确保中间数据不会塞满集群上的磁盘空间。超出限制的作业会被列入调度器的队列中进行等待,直到早期作业运行完毕。公平调度器再根据作业优先权和提交时间的排列情况从等待作业中调度即将运行的作业。