Scheduler:调度的是什么时候执行哪个计算程序
1. FIFO(先进先出调度器)
早起版本的Hadoop使用一种非常简单的方法来调度用户作业:按照作业提交的顺序,使用FIFO(先进先出)调度算法来运行作业。典型情况下,每个作业都会使用整个集群,因此作业必须等待直到轮到自己运行,虽然共享集群极有可能为多用户提供大量资源,但问题在于如何公平地在用户之间分配资源,这需要一个更好的调度器。生产作业需要及时完成,以便正在进行即兴查询的用户能够在合理时间内得到返回结果。
随后,加入设置作业优先级的功能,可以通过设置mapred.job.priority属性或JobClinet的setJobPriority()方法来设置优先级(在这两种优先级中,可以选择VERY_HIGH。HIGH,NORMAL,LOW,VERY_LOW中的一个值作为优先级)。作业调度器选择要运行的下一个作业时,它选择的是优先级最高的那个作业。然而,在FIFO调度算法中,优先级并不支持抢占,所以高优先级的作业仍然会被那些在高优先级作业被调度之前已经开始的、长时间运行的低优先级的作业所阻塞
在Hadoop中,MapReduce的调度器可以选择。默认的调度器是原始的基于队列的FIFO调度器,还有两个多用户调度器,分别名为Fair Schedule和Capacity
缺点举例:假如第一个计算程序运行需要60min,而第二个计算程序需要3min,由于先进先出的规则,所以第二个计算程序需要等第一个计算成功后才开始执行,这样的话,第二个计算程序需要等待63min,明明是3min可以解决的事情。
2. FAIR(公平调度器)
Fair Schedule(公平调度器)的目标是让每个用户公平地共享集群能力。如果只有一个作业运行,它会得到集群的所有资源。随着提交的作业越来越多,空闲的任务槽会以“让每个用户公平共享集群”这种方式进行分配。某个用户的一个短的作业将在合理的时间内完成,即便另一个用户的长时间作业正在运行而且还在运行过程中。
作业都被放在作业池中,在默认情况下,每个用户都有自己的作业池。提交作业数超过另一个用户的用户,不会因此而比后者获得更多集群资源。可以用map和reduce的任务槽数来决定作业池的最小容量,也可以设置每个池的权重。
Fair Schedule 支持抢占,所以如果一个池在特定的一段时间内未得到公平的资源共享,它会中止运行池中得到过多资源的任务,以便把任务槽让给运行资源不足的池。
缺点举例:假如第一个计算程序已经运行2hour,剩余10min就可以计算成功,但是突然来了几个任务,平分集群资源,这样使得第一个计算程序不得不延长时间才能计算成功。
3. CAPACITY(计算能力调度器)
针对多用户调度,Capacity Schedule 采用的方法稍有不同。集群由很多队列组成(类似于Fair Schedule的任务池,这些队列可能是层次结构的(因此,一个队列可能是另一个队列的孩子),每个队列有一个分配能力。这一点与Fair Schedule类似,只不过在每个队列内部,作业根据FIFO方式(优先级)进行调度。本质上,Capacity Schedule 允许用户或组织(使用队列进行定义)为每个用户或组织模拟一个独立的使用FIFO Scheduling 的MapReduce集群。相比之下,Fair Schedule 实际上支持【优先级】作业池内的FIFO作业调度,使其类似于能力调度)强制每个池内公平共享,使运行的作业共享池的资源。
可以按照需求进行配置使用资源,内部可以维护多个队列,多个队列之间可以进行资源分配,在每个队列中都是执行先进先出的。计算程序需要多少资源,集群就会给你分配多少资源,Hadoop2.x 默认使用