yarn框架的调度总结

可以参考文档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 注意事项

  1. 由多个队列组成,队列可以有自己的子队列
  2. 队列中使用FIFO Scheduler方式调度
  3. 当一个队列中有两个及以上job,就会占用别的队列的空闲资源。可以通过设置队列资源最大比重,防止该队列侵吞过多资源。
  4. 当一个队列被别的队列占用资源后,开始执行一个任务,不会马上kill其他容器,而是等待资源释放。
  5. 应用中需要指定队列名称,否则会全部被塞入default队列(单个队列),也就是相当于在使用FIFO Scheduler,使用mapreduce.job.queue.name参数设置。

2.2配置举例

下面是Capacity Scheduler比较基础的配置,配置文件名称为capacity-scheduler.xml
这里写图片描述

以上位置生成队列层次为

root
├── prod
└── dev
    ├── eng
    └── science
  1. 所有的队列都是root队列的子队列。
  2. 配置文件中可以看到,root队列设置了两个子队列,prod和dev,然后在dev队列下又设置了两个子队列eng和science。
  3. prod队列占用了百分之40的资源,dev队列占用了百分之60的资源。
  4. dev队列设置了最大资源占用量为百分之75,也就是说prod最少情况下也有百分之25的资源可以立即使用。
  5. 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 注意点

  1. Fair Scheduler不是默认调度模式,需要在yarn中配置参数。(设置yarn.resourcemanager.scheduler.class为org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler)
  2. 和Capacity Scheduler一样,所有队列都是root队列的子队列。
  3. 可以设置队列所占权重,默认权重是1。
  4. 可以通过配置文件设置队列的调度方式,有两种可以设置,defauleQueueSchedulingPolicy和schedulingPolicy。defauleQueueSchedulingPolicy设置默认队列调度方式。schedulingPolicy则针对单个队列设置调度方式会覆盖默认属性。
  5. 可以设置队列的最大最小资源,注意设置的最小资源并不是硬性指标,队列资源可以小于最小资源,这种情况下该队列获取资源的优先级就会比较高。一般设置最小资源是用来解决获取资源的优先级问题。
  6. 队列有三种配对原则,后面详细说明

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>
  1. 第一行表示使用specified策略,表示将应用放到名称匹配的队列中,如果这个应用没有指定队列名或队列名不存在,则说明不匹配这个规则,然后尝试下一个规则。
  2. 第二行使用primaryGroup,表示尝试把应用放在以用户所在的Unix组名命名的队列中,如果没有这个队列,不创建队列转而尝试下一个规则。
  3. 第三行使用default策略,表示把所有应用放到dev.eng队列中。

当然,我们可以不配置queuePlacementPolicy规则,调度器则默认采用如下规则:

<queuePlacementPolicy>
<rule name="specified" />
<rule name="user" />
</queuePlacementPolicy>
  1. 匹配队列名称
  2. 使用user匹配队列,如果不成功以名称创建队列

还有一个简单的配置策略可以使得所有的应用放入同一个队列(default),这样就可以让所有应用之间平等共享集群而不是在用户之间。这个配置的定义如下:

<queuePlacementPolicy>
<rule name="default" />
</queuePlacementPolicy>

3.4 抢占(preemption)

在Fair Scheduler中可以通过配置和参数设置抢占功能,就是杀掉别的应用的资源,来给自己使用,以提高应用的优先级。

  1. 通过设置一个全局的参数yarn.scheduler.fair.preemption=true来启用抢占功能。
  2. 有两种超时时间,一种是小于分配权重的超时抢占(fair share preemption timeout),一种是小于最小分配资源的超时抢占(minimum share preemption timeout)。
  3. 为所有队列配置最小超时时间。.元素来为某个队列指定最小超时时间
  4. 和则是分配权重超时。
  5. 上面提到的比例可以通过(配置所有队列)和(配置某个队列)进行配置,默认是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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值