目前,Hadoop作业调度器主要有三种:FIFO Scheduler、Capacity Scheduler和Fair Scheduler。Hadoop2.7.2默认的资源调度器是Capacity Scheduler。
一般大公司可能会用公平调度器,中小公司用容量调度器就够了.
Hadoop最初设计目的是支持大数据批处理作业,如日志挖掘、Web索引等作业,
为此,Hadoop仅提供了一个非常简单的调度机制:FIFO,即先来先服务,在该调度机制下,所有作业被统一提交到一个队列中,Hadoop按照提交顺序依次运行这些作业。
Hadoop作业类型
但随着Hadoop的普及,单个Hadoop集群的用户量越来越大,不同用户提交的应用程序往往具有不同的服务质量要求,典型的应用有以下几种:
批处理作业
这种作业往往耗时较长,对时间完成一般没有严格要求,如数据挖掘、机器学习等方面的应用程序。
交互式作业
这种作业期望能及时返回结果,如SQL查询(Hive)等
生产性作业
这种作业要求有一定量的资源保证,作业的运行和生产环境紧密相关,这种作业的优先级是最高的,不管你运行了哪些作业,必须保证生产型作业必须先运行,否则公司就没法开启生产任务,影响公司的效益,所以必须要有百分之40左右的系统资源留给生产性作业.
如统计值计算、垃圾数据分析等。
这三种类型的作业如果用同一个集群去跑Job任务的话就会出现竞争关系了.
此外,这些应用程序对硬件资源需求量也是不同的,如过滤、统计类作业一般为CPU密集型作业,而数据挖掘、机器学习作业一般为I/O密集型作业。因此,简单的FIFO调度策略不仅不能满足多样化需求,也不能充分利用硬件资源。
查看调度器配置
具体设置详见:yarn-default.xml文件
<property>
<description>The class to use as the resource scheduler.</description>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
三种调度器详解
先进先出调度器(FIFO)
排队依次处理,剩下的Job排队,
缺点:
如果你的队列前面提交了一个非常大的Job,这个Job没有处理完的话,后面的Job是无法执行的.都得排队,间接的造成了集群的利用率不是很高.即便剩下的资源可以满足后面小的Job的需求,但是因为前面的Job没有完成,也无法执行.
举例:
假如当前调度器有一个大的Job,需要启动两个MapTask,两个ReduceTask.假设 这四个Job每个都需要10G内存和4个的CPU.四个Task一起启动的话就需要40个G内存和16个cpu.
此时我计算机把资源分给了两个MapTask之后,再分给ReduceTask的时候发现资源不够了.此时MapTask已经运行了,但是ReduceTask因为资源不够而没运行.
假设整个机器还剩下8个G的内存,4个cpu. 此时资源还是不够就需要等待之前的任务执行完了之后把Container释放掉之后,内存回收回来了.
假如说调度器里面第二个Job是一个非常小的任务,只需要启动两个MapTask,然后每个MapTask只需要2G内存,两个CPU,此时剩下的计算机资源是完全满足第二个Job的.
虽然能满足第二个Job的运行.但是由于用的是FIFO调度器,所以不会让你第二个Job运行,只能等待第一个Job彻底运行完了,你才能运行.
这就是FIFO的缺陷.
容量调度器(Capacity Scheduler)Hadoop默认调度器
将集群中整个资源划分成多个队列,每个队列可以配置一个容量,容量调度器核心是容量.
比如说queueA 用20% , queueB用50%资源, queueC用 30%资源, 这样的话让批处理作业往queueA提交,让生产性作业往queueB提交,让交互式作业往queueC队列里面提交.
让不同类型的作业提交道不同的Queue,这样的话就满足了不同的需求.
Capacity Scheduler Capacity Scheduler 是Yahoo开发的多用户调度器,它以队列为单位划分资源,每个队列可设定一定比例的资源最低保证和使用上限,同时,每个用户也可设定一定的资源使用上限以防止资源滥用。而当一个队列的资源有剩余时,可暂时将剩余资源共享给其他队列。
总之,Capacity Scheduler 主要有以下几个特点:
①容量保证。管理员可为每个队列设置资源最低保证和资源使用上限,而所有提交到该队列的应用程序共享这些资源。
②灵活性,如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列 比如说生产性作业跑完了,queueB队列剩下50%的资源,这时候50%的资源就可以均匀的给queueA和queueC队列,而一旦该队列有新的应用程序提交,则其他队列释放的资源会归还给该队列。这种资源灵活分配的方式可明显提高资源利用率。
③多重租赁。支持多用户共享集群和多应用程序同时运行,你可以指定不同的用户分别往不同的队列里面提交资源,还可以配置限制,比如说queueA 队列只允许张三用户往里面提交Job 。为防止单个应用程序、用户或者队列独占集群中的资源(限制单个程序最多用多少资源,限制单个用户最多用多少资源),管理员可为之增加多重约束(比如单个应用程序同时运行的任务数等)。
④安全保证。每个队列有严格的ACL列表规定它的访问用户,每个用户可指定哪些用户允许查看自己应用程序的运行状态或者控制应用程序(比如杀死应用程序),比如说用户为张三的只能看queueA队列,不能看别的队列. 此外,管理员可指定队列管理员和集群系统管理员。
⑤动态更新配置文件。管理员可根据需要动态修改各种配置参数,配置完了不需要重启集群.刷新一下配置就生效了.
公平调度器(Fair Scheduler)
有可能先提交的Job最后完成,也有可能候提交的Job先完成.
同一个队列中,所有已经提交,未运行结束的Job,获取到队列中的资源是平等的
导致在一个队列中,小的Job运行有优势,大的Job可能不能及时获取到必须的所有资源,但是不至于饿死,后续别的Job结束之后再给这些资源分给剩下没运行的Job资源.
举例
目前队列A有20个CPU,20G的内存,然后现在队列A中已经提交但是还没运行的Job里面有:
Job1需要两个MapTask,需要两个CPU,两G内存,Job1还有两个ReduceTask需要1个cpu和1G内存.
Job2有两个MapTask,需要四个CPU和2G内存, 有两个ReduceTask,需要2个CPU和2G内存.
Job3有一个MapTask 只需要1个CPU和一个内存就够了.
Job4需要资源比较多,有4个MapTask,需要4个CPU和2G内存, 4个ReduceTask 需要2个CPU和2G内存.
当前队列A有20个CPU和20G的内存
在实际分配资源的时候只考虑内存,比如说Job2 两个MapTask需要8个CPU,但是我只给你5个G的cpu(20CPU除以4).因为我只拿内存来考虑,既然分配的内存已经够你用了,就给你8个CPU,然后让你先启动MapTask,然后你ReduceTask不够就先等待,等你MapTask先运行完了,再把资源给你ReduceTask.
Job4明显不够,但是我给你队列所有的CPU除以4的CPU资源和所有的内存除以4的内存资源给你,够你先启动一个MapTask,此时可能别的Job已经运行完了,比如说Job3可能已经运行完了,此时可能又来了个Job5 ,剩下的没运行完的Job再平等的获取剩下的资源(就是剩下的资源除以Job总数,然后再平均分给每个Job)
Fair Scheduler Fair Schedulere是Facebook开发的多用户调度器。
公平调度器的目的是让所有的作业随着时间的推移,都能平均地获取等同的共享资源!当一个作业在运行时,它会使用整个集群但是如果有其他作业提交上来,系统会将空闲的资源分配给新的作业!每个任务大致上会获取平等数量的资源!和传统的调度策略不同的是
它会让小的任务在合理的时间完成,同时不会让需要长时间运行的耗费大量资源的应用挨饿!
同Capacity Scheduler类似,它以队列为单位划分资源,每个队列可设定一定比例的资源最低保证和使用上限,同时,每个用户也可设定一定的资源使用上限以防止资源滥用;当一个队列的资源有剩余时,可暂时将剩余资源共享给其他队列。
当然,Fair Scheduler也存在很多与Capacity Scheduler不同之处,这主要体现在以下几个方面:
①资源公平共享。在每个队列中,Fair Scheduler 可选择按照FIFO、Fair或DRF策略为应用程序分配资源。其中,Fair 策略(默认)是一种基于最大最小公平算法实现的资源多路复用方式,默认情况下,每个队列内部采用该方式分配资源。这意味着,如果一个队列中有两个应用程序同时运行,则每个应用程序可得到1/2的资源;如果三个应用程序同时运行,则每个应用程序可得到1/3的资源。
②支持资源抢占。当某个队列中有剩余资源时,调度器会将这些资源共享给其他队列,而当该队列中有新的应用程序提交时,调度器要为它回收资源。为了尽可能降低不必要的计算浪费,调度器采用了先等待再强制回收的策略,即如果等待一段时间后尚有未归还的资源,则会进行资源抢占:从那些超额使用资源的队列中杀死一部分任务,进而释放资源。
③负载均衡。Fair Scheduler提供了一个基于任务数目的负载均衡机制,该机制尽可能将系统中的任务均匀分配到各个节点上。此外,用户也可以根据自己的需要设计负载均衡机制。
④调度策略配置灵活。Fair Scheduler允许管理员为每个队列单独设置调度策略(当前支持FIFO、Fair或DRF三种)。
⑤提高小应用程序响应时间。由于采用了最大最小公平算法,小作业可以快速获取资源并运行完成