作者:罗伯特1980_823 | 来源:互联网 | 2023-09-13 06:16
可以参考文档http://blog.csdn.net/suifeng3051/article/details/49508261,这篇文章基本是比较详细得翻译了hadoop权威指南第四版的调度部分,下面的文章我主要把注意点总结一下,写的比较精简
一. 调度器的选择
yarn有三种调度器:FIFO Scheduler、Capacity Scheduler、Fair Scheduler
下图演示了三种调度的不同
1.1 FIFO Scheduler
这种调度方式比较简单,不需要额外配置,单个job会占用掉所有资源,这样小任务可能被大任务阻塞一般不推荐使用,多用于其他调度的子队列中
1.2 Capacity Scheduler
针对不同的应用分配不同量的资源,可以保证小任务可以立即执行得到反馈,但和Fair Scheduler相比不能百分百发挥集群性能。在默认情况下使用Capacity Scheduler,但如果不给Capacity Scheduler配置对应的队列,其实和使用FIFO Scheduler是等价的。
1.3 Fair Scheduler
可以百分百发挥集群性能,并设置应用使用集群的比重,不过对于后面起来的任务有一定的滞后行,因为要等待之前的任务释放资源。
二. Capacity Scheduler
2.1 注意事项
- 由多个队列组成,队列可以有自己的子队列
- 队列中使用FIFO Scheduler方式调度
- 当一个队列中有两个及以上job,就会占用别的队列的空闲资源。可以通过设置队列资源最大比重,防止该队列侵吞过多资源。
- 当一个队列被别的队列占用资源后,开始执行一个任务,不会马上kill其他容器,而是等待资源释放。
- 应用中需要指定队列名称,否则会全部被塞入default队列(单个队列),也就是相当于在使用FIFO Scheduler,使用mapreduce.job.queue.name参数设置。
2.2配置举例
下面是Capacity Scheduler比较基础的配置,配置文件名称为capacity-scheduler.xml
以上位置生成队列层次为
root
├── prod
└── dev
├── eng
└── science
- 所有的队列都是root队列的子队列。
- 配置文件中可以看到,root队列设置了两个子队列,prod和dev,然后在dev队列下又设置了两个子队列eng和science。
- prod队列占用了百分之40的资源,dev队列占用了百分之60的资源。
- dev队列设置了最大资源占用量为百分之75,也就是说prod最少情况下也有百分之25的资源可以立即使用。
- eng和science平分了dev的资源,也就是说在其中一个队列空闲并且prod队列也空闲的状态下,另一个可以占用集群最大为百分之75的资源。
2.3参数配置
这里写链接内容
三. Fair Scheduler
如图所示,Fair Scheduler也是有队列的概念的。队列A中的运行job1,一开始会占用所有集群资源,随后队列B中运行job2,随着计算job1的资源被释放,然后会分配给队列B计算job2,然后队列B中运行job3,队列A并不会释放资源,因为不是本队列中的任务,队列B会逐渐释放资源给job3。所以Fair Scheduler的计算有一定的迟滞行,但对整体效率来说是最优的。
3.1 注意点
- Fair Scheduler不是默认调度模式,需要在yarn中配置参数。(设置yarn.resourcemanager.scheduler.class为org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler)
- 和Capacity Scheduler一样,所有队列都是root队列的子队列。
- 可以设置队列所占权重,默认权重是1。
- 可以通过配置文件设置队列的调度方式,有两种可以设置,defauleQueueSchedulingPolicy和schedulingPolicy。defauleQueueSchedulingPolicy设置默认队列调度方式。schedulingPolicy则针对单个队列设置调度方式会覆盖默认属性。
- 可以设置队列的最大最小资源,注意设置的最小资源并不是硬性指标,队列资源可以小于最小资源,这种情况下该队列获取资源的优先级就会比较高。一般设置最小资源是用来解决获取资源的优先级问题。
- 队列有三种配对原则,后面详细说明
3.2 配置举例
根据上图配置可以发现
1. 队列层次和上面Capacity Scheduler的配置例子是一致的
2. defaultQueueSchedulingPolicy设置到了fair就是表示在没有额外配置的情况下,队列使用Fair Scheduler。
3. prod队列配置了schedulingPolicy为fifo表示,只有prod队列使用FIFO Scheduler,其他所有队列使用默认配置的Fair Scheduler。
4. 队列中配置的数字是权重,上面的配置改成prod设置2, dev设置3效果是一样的。默认情况下,权重是1
3.3队列配对策略(queuePalacementPolicy)
根据上图设置的queuePlacemenetPolicy,可以Fair Scheduler更具有灵活性,可以自己定制队列配对原则。
元素定义了一个规则列表,其中的每个规则会被逐个尝试直到匹配成功。
如上面的例子:
<queuePlacementPolicy>
<rule name="specified" create="false" />
<rule name="primaryGroup" create="false" />
<rule name="default" queue="dev.eng" />
queuePlacementPolicy>
- 第一行表示使用specified策略,表示将应用放到名称匹配的队列中,如果这个应用没有指定队列名或队列名不存在,则说明不匹配这个规则,然后尝试下一个规则。
- 第二行使用primaryGroup,表示尝试把应用放在以用户所在的Unix组名命名的队列中,如果没有这个队列,不创建队列转而尝试下一个规则。
- 第三行使用default策略,表示把所有应用放到dev.eng队列中。
当然,我们可以不配置queuePlacementPolicy规则,调度器则默认采用如下规则:
<queuePlacementPolicy>
<rule name="specified" />
<rule name="user" />
queuePlacementPolicy>
- 匹配队列名称
- 使用user匹配队列,如果不成功以名称创建队列
还有一个简单的配置策略可以使得所有的应用放入同一个队列(default),这样就可以让所有应用之间平等共享集群而不是在用户之间。这个配置的定义如下:
<queuePlacementPolicy>
<rule name="default" />
queuePlacementPolicy>
3.4 抢占(preemption)
在Fair Scheduler中可以通过配置和参数设置抢占功能,就是杀掉别的应用的资源,来给自己使用,以提高应用的优先级。
- 通过设置一个全局的参数yarn.scheduler.fair.preemption=true来启用抢占功能。
- 有两种超时时间,一种是小于分配权重的超时抢占(fair share preemption timeout),一种是小于最小分配资源的超时抢占(minimum share preemption timeout)。
- 为所有队列配置最小超时时间。.元素来为某个队列指定最小超时时间
- 和则是分配权重超时。
- 上面提到的比例可以通过(配置所有队列)和(配置某个队列)进行配置,默认是0.5。
3.5 参数配置
这里写链接内容
四. 延迟调度(Delay Scheduling)
yarn所有的调度方式都会优先使用与数据距离更近的机器进行计算,这样可以节省网络开销。延迟调度就是在本地资源被使用时,调度中心会等待一会,如果等待时间中本地资源得到释放,就会调用本地资源。反之则使用较远的资源。
什么是调度机会:
每个node manager都会周期性的向调度中心发送节点信息(默认一秒),这些信息中包含了那些容器和资源是可被获得的。调度中心收到一次心跳,如果节点有资源可以被调用,就是一次调度机会。
Capacity Scheduler:
通过参数yarn.scheduler.capacity.node-locality-delay配置。是一个正整数,调度器尝试调度一个同机架不同节点的container之前,最多跳过的调度机会,通常而言,该值被设置成集群中机架数目,默认情况下为-1,表示不启用该功能
Fair Scheduler:
通过配置yarn.scheduler.fair.locality.threshold.node和yarn.scheduler.fair.locality.threshold.rack。
当yarn.scheduler.fair.locality.threshold.node设置为0.5表示,必须要超过集群中一半的节点都提供过调度机会,才会尝试不同节点相同相同机架的其他节点。
yarn.scheduler.fair.locality.threshold.rack同理类推,是不同机架的节点。
五. 判定资源比例(Dominant Resource Fairness)
在以前的框架中,资源单单指的是内存,现在yarn框架可以判断的资源可能包含两种及以上,例如cpu等等,这种情况下要怎么判断应用占用资源的比重。
举个例子:
一个集群有100个cpu和10TB的内存。应用A需要资源(2CPU, 300GB), 应用B需要资源(6CPU,100GB)。
那么A应用所占集群总资源(2%,3%), B应用所占集群总资源(6%, 1%)。
按照现行策略是取应用中占比大的作为其资源占比,那么
A就是要占用资源的3%,而B占用资源6%
在默认情况下Dominant Resource Fairness策略是没有被使用的,只看了内存资源,如果启用需要修改配置
Capacity Scheduler:
yarn.scheduler.capacity.resource-calculator为org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
Fair Scheduler:
设置为drf。