前言
理想情况下,YARN应用发出的资源请求应该立刻给予满足。然而现实中资源是有限的,在一个繁忙的集群中上,一个应用经常需要等待才能得到所需要的资源。YARN调度器的工作就是根据既定策略为应用分配资源。调度通常是一个难题,并且没有一个所谓的“最好”策略,这也是为什么YARN提供了多种调度器和可配置策略供我们选择的原因。接下来本文将深度探讨这个问题。
调度器和调度算法
YARN中有三种调度器可用:FIFO调度器(FIFO Scheduler)、容量调度器(Capacity Scheduler)和公平调度器(Fair Scheduler)。从Apache Hadoop 2.6.0版本开始,YARN默认使用容量调度器(Capacity Scheduler)。Fair Scheduler是Cloudera分布式Hadoop(CDH)使用的默认调度器。CDH与Hortonworks数据平台(HDP)合并后,Cloudera数据平台(CDP)应运而生,并使用Capacity Scheduler而不是Fair Scheduler。如果您使用Apache Hadoop,还建议使用Capacity Scheduler。。详见配置如下:
<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)
- 概念
FIFO调度器(First In First Out):单队列,根据提交作业的先后顺序,先来先服务。
大的应用会占用集群中的资源,所以每个应用必须等待直到轮到自己运行。 - 优缺点
(1)优点
简单易懂,不需要任何配置
(2)缺点
不支持多队列,生产环境很少使用 - 图解
- 容量调度器(Capacity Scheduler)
-
概念
Capacity Scheduler是Yahoo开发的多用户调度器。容量调度器允许多个组织共享一个Hadoop集群,每个组织可以分配到全部集群资源的一部分。每个组织被分配为一个专门的队列,每个队列被配置为可以使用的一定的集群资源。
队列可以被进一步按层次划分,这样每个组织内的不同用户能够共享该组织队列所分配的资源。
在一个队列内,使用FIFO调度策略对应用进行调度。 -
特点
(1)多队列
每个队列可配置一定的资源,每个队列采用FIFO策略。
(2)容量保证
管理员可以为每个队列设置资源最低和资源使用上限。这样的目的是限制某个队列过多侵占其它队列的资源。
(3)灵活性
如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
(4)多租客
支持多用户共享集群和多应用程序同时运行。
为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业做占用的资源进行限定。 -
资源调度算法
假设有一个层次结构如下:
root
|--queue1 20%
|--queue2 50%
|--queue3 30%
|--q1 50%
|--q2 50%
在root队列下定义三个队列queue1、queue2和queue3,分别占20%、50%和30%的容量。而队列queue3下又定义了两个队列q1和q2,各占50%的容量。
需要注意的是,对特定队列进行配置时,是通过以下形式的配置属性:
yarn.scheduler.capacity.<queue-path>.<sub-property>
进行设置的,其中,表示队列的层次路径(用圆点隔开),例如root.queue1。
<configuration>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>queue1,queue2,queue3</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.queue3.queues</name>
<value>q1,q2</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.queue1.capacity</name>
<value>20</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.queue2.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.queue3.capacity</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.queue3.q1.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.queue3.q2.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.queue3.maximum-capacity</name>
<value>75</value>
</property>
</configuration>
可以看到,queue3队列被进一步划分成q1和q2两个容量相等的队列。由于queue3队列的最大容量被设置为75%,因此即使queue1和queue2队列资源空闲,queue3队列也不会占用全部的集群资源。由于没有对其他队列进行最大容量限制,queue1和queue2可能会占用全部的集群资源。
(1)队列资源分配
从root开始,使用深度优先算法,优先选择资源占用了最低的队列分配资源。
(2)作业资源分配
默认按照提交作业的优先级和提交时间顺序分配资源。
(3)容器资源分配
按照容器优先级进行分配,如果优先级相同,按照数据本地性原则:
a.任务和数据在同一节点
b.任务和数据在同一机架
c.任务和数据不在同一节点也不在同一机架
-
yarn.scheduler.capacity.root.default.maximum-am-resource-percent
(1)参数的作用
yarn.scheduler.capacity.root.default.maximum-am-resource-percent参数用于定义资源管理器YARN中的容量调度器的默认AM(ApplicationMaster)资源使用比例。AM是在YARN集群中运行的应用程序的管理器,负责协调应用程序的资源请求和任务分配。
该参数的值表示AM可使用的最大资源量与集群可用资源量的比例。通过设置该参数,可以限制每个AM可以使用的资源量,以防止一个AM过度使用集群资源而导致其他应用程序无法获得足够的资源。
例如,如果设置maximum-am-resource-percent为0.2,表示每个AM最多可以使用集群资源的20%。
通过调整该参数的值,可以根据集群的资源情况和应用程序的需求来平衡资源分配,确保每个应用程序都能获得足够的资源而不会过度占用整个集群。(2)需要设置多大
yarn.scheduler.capacity.root.default.maximum-am-resource-percent是YARN中Capacity调度器的参数,用于控制AM(Application Master)的最大资源占用百分比。具体来说,它定义了一个队列中AM所能够使用的资源量相对于整个队列可用资源的最大比例。
默认情况下,yarn.scheduler.capacity.root.default.maximum-am-resource-percent的值是100,即AM能够使用队列中的全部可用资源。这意味着AM可以使用队列中的全部资源,但也可能导致队列中其他任务的资源紧缺。
合适的设置取决于集群的资源规模和使用情况。如果您的集群有足够的资源并且AM的资源需求很高,可以考虑将该值设置为较高的百分比。如果集群资源较为有限或者不希望AM占用过多的资源,可以将该值设置为较小的百分比。
需要注意的是,设置该参数需要谨慎,确保AM有足够的资源来执行任务,并且不会对其他任务的资源分配造成影响。最好通过实际测试进行调整,根据集群的性能和实际需求进行合适的设置。
- 公平调度器(Fair Scheduler)
- 概念
Fair Schedulere是Facebook开发的多用户调度器。公平调度器旨在所有运行的应用公平分配资源。 - 特点
(1)多队列
每个队列可配置一定的资源,每个队列采用FIFO策略。
(2)容量保证
管理员可以为每个队列设置资源最低和资源使用上限。这样的目的是限制某个队列过多侵占其它队列的资源。
(3)灵活性
如果一个队列中的资源有剩余,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序提交,则其他队列借调的资源会归还给该队列。
(4)多租客
支持多用户共享集群和多应用程序同时运行。
为了防止同一个用户的作业独占队列中的资源,该调度器会对同一用户提交的作业做占用的资源进行限定。
(5)核心调度策略优先选择对资源缺额比例大的。
(6)每个队列都可以单独设置资源的分配方式,如FIFO、FAIR、DRF
- 缺额
(1)公平调度器的设计目的
在时间尺度上,所有作业获得公平资源。某一时刻一个作业应获资源和实际获得的资源的差值叫缺额。
(2)调度器会优先选择缺额较大的作业分配资源。
后记
- 对几个概念进行简单总结:
- 队列
YARN中的调度队列用于分隔不同类型或优先级的任务,在资源分配时起到隔离和控制的作用。可以根据业务需求配置多个队列,每个队列可以有不同的资源限制和调度策略。 - 资源分配
YARN调度策略通过动态分配资源给不同的任务进行控制,资源分配可以根据任务优先级、任务的资源需求和集群资源的可用情况进行调整。常见的资源分配算法有公平调度算法和容量调度算法。 - Capacity Scheduler
Capacity Scheduler是YARN中最常用的调度器之一,它基于队列的容量限制和优先级,按比例分配资源给队列中的任务。该调度器能够平衡任务的优先级和资源需求,并提供灵活的队列配置选项,适用于多租户场景。 - Fair Scheduler
Fair Scheduler是另一个常见的调度器,它将资源按照公平共享原则分配给任务。Fair Scheduler可以根据任务的需求动态地进行资源分配,避免饥饿现象。同时,它还支持预留资源和抢占机制,对于实时任务和紧急任务有很好的支持。 - Capacity Scheduler with Preemption
这是Capacity Scheduler的一个扩展版本,引入了弹性预占(preemption)机制。当集群资源不足时,该调度器可以根据预定义的优先级和配置设置,自动地终止部分运行中的任务,以确保优先级较高的任务能够得到足够的资源。
- 最佳实践和调优技巧
- 配置队列
合理划分队列,根据任务的优先级和资源需求进行配置。可以通过设置队列的容量限制、优先级和资源亲和性等属性,进行细粒度的调控。 - 资源预留
为关键任务和高优先级任务预留足够的资源,以确保其正常执行。可以在配置文件中设置资源预留比例或者使用调度队列的资源保证机制。 - 监控和调整
实时监控集群资源的使用情况和任务的执行状况,及时调整调度策略和队列配置,以适应不同的负载变化。 - 资源限制和约束
根据实际情况,限制任务使用的资源量,避免资源过度消耗或浪费。
参考文献
https://hadoop.apache.org/docs/stable/hadoop-yarn/hadoop-yarn-site/YARN.html
https://www.alibabacloud.com/help/en/e-mapreduce/latest/yarndiaoduqi
hadoop权威指南