yarn三种调度器(资源调度策略或机制)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yarn三种调度器(资源调度策略或机制)相关的知识,希望对你有一定的参考价值。
参考技术A在理想状态下,我们对yarn的资源请求,应该是立即得到相应,但是实际情况往往资源是有限的,如果集群很繁忙的话,一个应用的资源请求需要等待一段时间才能得到资源。为此yarn提供了三种调度器供我们选择
FIFO Scheduler 把应用按照提交的顺序拍成一个队列,上图是一个先进先出的队列,但是他并不适合共享集群,上图中job1在0点提交任务,资源使用率为100%,那么job2任务在1点提交的任务,只能等job1在5点钟执行完任务后释放资源,job2才开始执行任务,所以小任务会被大任务阻塞
而对于Capacity Scheduler,提前预留一个专门的通道给小任务执行,但是这样会预先占用一些资源,大任务只能利用80%的资源,就导致大任务的运行时间要大于FIFO的大任务的运行时间;如上图,而且小任务前后会造成资源浪费
在Fair Scheduler调度器中,我们不需要预留资源,Fair调度器会动态运行所有job的资源,如上图,一开始0点的时候,job1占用所有集群的资源,当job2提交的时候,Fair调度器会分配一半资源给job2,让job1和job2并行的运行任务
当job2在1点钟提交任务的时候,获取资源会有 一定的延时 ,因为需要job1关闭掉一些container,释放一些资源;小任务完成后,释放自己的资源,然后大任务又获取所有集群的资源
最终Fair调度器提高了资源利用率,又保证了小任务的及时完成
在企业中并不是只有一个人来执行MapReduce程序单独使用Yarn的资源,实际开发中,会有很多人一起使用Yarn这个资源,如果每个人都提交了job,这个时候Yarn就需要进行调度去分配资源给job,
下面三种调度机制,默认的是FIFO机制,这种机制是先进先出队列机制,在企业中基本不会使用,第二种机制Capacity机制是使用最多的,它是开辟出两个队列分给不同的组来执行job,但相同的组还是要按照先进先出的队列机制,第三种机制也常有使用。
Yarn调度队列
1 概述
在Yarn中有是三种调度器可以选择: FIFO Scheduler,Capacity Scheduler,Fair Scheduler。
FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler是最简单也是最容易理解的调度器,不需要任何配置,但其不适用于共享集群。 大的应用可能会占用所有集群资源,这就导致其它应用被阻塞。 在共享集群中,更适合采用Capacity Scheduler或Fair Scheduler,这两种调度器都允许大任务和小任务在提交的同时获得一定的资源。
下面Yarn调度器对比图展示了这几个调度器的区别,从图中可以看出,在FIFO调度器中,小任务会被大任务阻塞。
而对于Capacity调度器,有一个专门的队列用来运行小任务,但是为小任务专门设置一个队列会占用一定的集群资源,这就导致大任务的执行时间会落后于使用FIFO调度器时的时间。
在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。 如下图所示,当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源; 当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
需要注意的是,在下图Fair调度器中,从第二个任务提交到获得资源会有一定的延迟,因为它需要等待第一个任务释放占用的Container。 小任务执行完成以后也会释放自己占用的资源,大任务又获得了全部的系统资源。 最终的效果就是Fair调度器既得到了高资源的利用率又能保证小任务的及时执行。
2 Capacity Scheduler 的配置
2.1 介绍
2.2 CS配置
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>a,b,c</value>
<description>The queues at the this level (root is the root queue).
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.queues</name>
<value>a1,a2</value>
<description>The queues at the this level (root is the root queue).
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.b.queues</name>
<value>b1,b2,b3</value>
<description>The queues at the this level (root is the root queue).
</description>
</property>
3 Fair Scheduler
3.1 队列配置
<?xml version="1.0"?>
<allocations>
<queue name="sample_queue">
<minResources>10000 mb,0vcores</minResources>
<maxResources>90000 mb,0vcores</maxResources>
<maxRunningApps>50</maxRunningApps>
<maxAMShare>0.1</maxAMShare>
<weight>2.0</weight>
<schedulingPolicy>fair</schedulingPolicy>
<queue name="sample_sub_queue">
<aclSubmitApps>charlie</aclSubmitApps>
<minResources>5000 mb,0vcores</minResources>
</queue>
<queue name="sample_reservable_queue">
<reservation></reservation>
</queue>
</queue>
<queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
<queueMaxResourcesDefault>40000 mb,0vcores</queueMaxResourcesDefault>
<!-- Queue 'secondary_group_queue' is a parent queue and may have
user queues under it -->
<queue name="secondary_group_queue" type="parent">
<weight>3.0</weight>
<maxChildResources>4096 mb,4vcores</maxChildResources>
</queue>
<user name="sample_user">
<maxRunningApps>30</maxRunningApps>
</user>
<userMaxAppsDefault>5</userMaxAppsDefault>
<queuePlacementPolicy>
<rule name="specified" />
<rule name="primaryGroup" create="false" />
<rule name="nestedUserQueue">
<rule name="secondaryGroupExistingQueue" create="false" />
</rule>
<rule name="default" queue="sample_queue"/>
</queuePlacementPolicy>
</allocations>
3.2 抢占
-minimum share preemption timeout
-fair share preemption timeout
<defaultFairSharePreemptionTimeout>
和元素级元素
<fairSharePreemptionTimeout>
分别配置所有队列和某个队列的超时时间。
上面提到的比例可以通过
<defaultFairSharePreemptionThreshold>
(配置所有队列)和
<fairSharePreemptionThreshold>
(配置某个队列)进行配置,默认是0.5。
References
Hadoop: Capacity Scheduler
Container资源动态调整
以上是关于yarn三种调度器(资源调度策略或机制)的主要内容,如果未能解决你的问题,请参考以下文章