yarn参数与队列介绍

1. yarn参数

Yarn中资源主要包含Cpu和内存,Yarn集群在节点数固定的情况下如果性能有瓶颈,可以尝试进行如下参数的调节。这些参数可以配置在$HADOOP_HOME/etc/hadoop/yarn-site.xml配置文件中。

1.1 资源相关参数

1) yarn.nodemanager.resource.detect-hardware-capabilities

该参数表示是否让Yarn自动探测服务器的CPU和内存资源,默认值false。

2) yarn.nodemanager.resource.cpu-vcores

该参数可以指定每个NodeManager上可以使用的虚拟CPU核心数,一个物理CPU可以被划分成多个虚拟CPU,该参数配置值可以大于物理CPU个数,可以提高并发,但配置过大有可能会带来服务器处理不过来、负载增大问题。 默认值为-1/8,当yarn.nodemanager.resource.detect-hardware-capabilities为true时,在 Windows 和 Linux 系统中会自动确定使用的cpu核心数;否则默认值为8,手动配置时,建议该值比真CPU个数小几个,留出一定的CPU用于其他服务使用。

3) yarn.nodemanager.resource.memory-mb

该参数表示每个节点可以分配给NodeManager的内存量,单位MB。默认值为-1/8GB,当yarn.nodemanager.resource.detect-hardware-capabilities为true时,在 Windows 和 Linux 系统中会自动计算;否则默认值为8192MB(8GB)。手动配置时,建议给Yarn分配80%内存,留出20%给服务器其他服务使用。

4) yarn.nodemanager.resource.percentage-physical-cpu-limit

该参数指定NodeManager可以使用节点的物理CPU核心百分比,默认值100,表示Yarn NodeManager可以使用节点所有的物理CPU核心。建议可以设置为80%,留出20%给服务器其他服务使用。

5) yarn.nodemanager.resource.system-reserved-memory-mb

该参数表示NodeManager节点上为非Yarn进程保留的物理内存量。该配置仅在yarn.nodemanager.resource.detect-hardware-capabilities设置为true并且yarn.nodemanager.resource.memory-mb设置为-1时生效。默认值为-1,即20%*(系统内存-HADOOP使用内存)

6) yarn.nodemanager.resource.pcores-vcores-multiplier

该参数表示将物理核心数转换成虚拟核心个数的乘数。默认值为1.0,表示一个物理的cpu当做一个vcore使用。提交到NodeManager上的任务有些是非计算型密集任务,有些是计算密集型任务,那么通过设置这个参数可以更合理的利用资源。一般如果集群资源够用,不需调节此参数。

7) yarn.nodemanager.vmem-pmem-ratio

该值表示Yarn中任务的单位物理内存可使用的虚拟内存比例,默认值为2.1,表示任务每分配1MB的物理内存,虚拟内存最大可使用2.1MB。如果Yarn集群中内存较为紧张可以适当调大该参数。一般集群内存够用,不需调节此参数。

虚拟内存是计算机系统内存管理的一种技术,为每个进程提供了连续的、私有的地址空间,让程序可以拥有超过物理内存大小的可用内存空间。在Yarn中,虚拟内存的原理是将容器的内存分配扩展到硬盘空间,使得每个容器都能认为自己拥有连续可用的内存,从而更有效地管理内存,减少出错,并提高系统资源利用率和整体性能。

8) yarn.nodemanager.pmem-check-enabled

是否启动一个线程检查container使用的物理内存量,如果使用内存量超出NodeManager分配使用的内存域值,则直接kill掉对应的任务,默认为true,不建议关闭。

9) yarn.nodemanager.vmem-check-enabled

是否启动一个线程检查container使用的虚拟内存量,如果使用内存量超出NodeManager分配使用的虚拟内存阈值,则直接kill掉对应的任务,默认为true。一般关闭

10) yarn.scheduler.minimum-allocation-mb

该参数表示为每个Container容器请求分配的最小内存,默认值1024MB。如果容器请求的内存参数小于该值,会以1024MB进行分配,如果NodeManager可被分配的内存小于该值,则NodeManager会被ResourceManager关闭。

11) yarn.scheduler.maximum-allocation-mb

该参数表示为每个Container容器请求分配的最大内存,默认值8192 MB。如果容器请求的资源超过该值,程序抛出异常。

12) yarn.scheduler.minimum-allocation-vcores

该参数表示为每个Container容器请求分配的最小cpu个数,默认值为1,低于此值的请求将被设置为此属性对应的值。cpu 核数小于此值的NodeManager会被ResourceManager关闭。

13) yarn.scheduler.maximum-allocation-vcores

该参数表示为每个Container容器请求分配的最大cpu个数,默认值为4。如果容器请求的资源超过该值,程序抛出异常。

1.2 其他参数

1) yarn.resourcemanager.client.thread-count

默认50,ResourceManager中用于处理应用程序请求的线程数。

2) yarn.resourcemanager.amlauncher.thread-count

默认50,ResourceManager中用于启动/清理AM的线程数。

3) yarn.resourcemanager.scheduler.client.thread-count

默认值50,ResourceManager中处理AM RPC请求的线程数。

4) yarn.resourcemanager.resource-tracker.client.thread-count

默认值50,ResourceManager中处理来自NodeManager RPC请求的线程数。

5) yarn.log-aggregation-enable

默认false,是否启用日志聚合。

6) yarn.log-aggregation.retain-seconds

聚合日志保留的时长,默认-1,表示永久保存,一般设置3-7天即可。

7) yarn.resourcemanager.scheduler.class

资源调度策略类,默认值:org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler,即CapacityScheduler 容量调度。

2. Yarn资源调度器

当向Yarn集群中提交Appliation后,Yarn调度器(Yarn Scheduler)负责为提交的Application进行资源调度和分配。Yarn中提供了如下几种不同的调度器:FIFO调度器(First-In-Fist-Out Scheduler)、Capacity调度器(Capacity Schduler)、Fair调度器(Fair Scheduler),每种调度器都有不同的调度算法和特点,下面分别对以上不同的调度算法进行解释。

2.1 FIFO调度器

FIFO调度器(First-In-Fist-Out Scheduler),Yarn中最简单的调度器。FIFO Scheduler 会将提交的应用程序按提交顺序放入一个先进先出的队列中,进行资源分配时,先给队列中最头上的应用分配资源,待头上的应用资源需求满足后再给下一个应用分配资源,以此类推。这种调度器调度资源时,有可能某个资源需求大的应用占用所有集群资源,从而导致其他的应用被阻塞。

FIFO调度器只支持单队列,先进队列的任务先获取资源,排在后面的任务只能等待,不能同时保证其他任务获取运行资源,目前这种调度器已经很少使用。

2.1.1 使用方式及测试

在Yarn集群各个节点$HADOO_HOME/etc/hadoop/yarn-site.xml中指定如下参数:

<!-- 配置资源调度器为FIFO --> 
<property> 
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler</value>
</property>

配置完成后,重启Yarn集群,在WebUI可以看到对应的Yarn Scheduler类型:

在任意Yarn客户端向Yarn中提价两个pi任务,命令如下:

[root@hadoop105 ~]# hadoop jar /opt/module/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar pi 20 1000
[root@hadoop105 ~]# hadoop jar /opt/module/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar pi 20 1000

可以通过Yarn WebUI看到Yarn会对第一个任务进行资源分配,然后再对第二个任务进行资源分配,依次调度。

2.2 Capacity调度器

Capacity调度器(Capacity Schduler)是Yarn中默认配置的资源调度器,允许多租户安全地共享一个大型集群。Capacity调度器中,支持配置多个资源队列,可以为每个资源队列指定最低、最高可使用的资源比例,在进行资源分配时,优先将空闲资源分配给“实际资源/预算资源”比值最低的队列,每个资源队列内部采用FIFO调度策略。

Capacity调度器的核心思想是提前做预算,在预算指导下分享集群资源。其特点如下:

  • 支持多租户共享集群,通过配置可以限制每个用户使用的资源比例。
  • 集群资源由多个资源队列分享。
  • 每个队列需要预先配置资源分配比例(最低、最高使用的资源比例),即事先规划好预算比例。
  • 空闲资源优先分配给“实际资源/预算资源”比值最低的队列。
  • 每个队列内部任务采用FIFO调度策略。
  • 如果一个资源队列中资源有剩余,可以共享给其他需要资源的队列,但一旦该资源队列有任务提交运行,共享给其他资源队列的资源会及时回收供该资源队列使用。注意:queueB要收回共享给queueA的资源要等到queueA占用资源的任务执行完。

2.2.1 Capacity资源分配策略

Capacity Scheduler调度器中如果有多个资源队列,这些个资源队列进行资源分配时优先分配给“实际资源/预算资源”比值最低的队列。每个队列中有多个Job,给每个队列内的多个Job进行资源分配时,默认按照Job的FIFO顺序进行资源分配,用户也可以提交JOB时指定任务执行的优先级,优先级最高的先分配资源。

2.2.2 多资源队列配置

Yarn中默认只有资源队列只有一个,默认是default,为了避免各个任务之间使用资源产生影响,做到资源细粒度管控和隔离,我们可以针对不同业务模块、不同部门、不同项目组来创建不同的资源队列,保证生产环境中任务稳定运行。

按照如下步骤在Yarn中除了default资源队列外,再配置2个资源队列queueA和queueB,并指定default、queueA、queueB使用最大最小资源信息:default(min:30%,max:60%)、queueA(min:40%,max:80%)、default(min:30%,max:60%)。

1) 在各个Yarn节点上配置$HADOOP_HOME/etc/hadoop/capacity-scheduler.xml文件

<configuration> 
... ... 
	<!-- 指定Yarn中所有资源队列 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.queues</name> 
	<value>default,queueA,queueB</value> 
	</property> 
	
	
	<!-- 设置default 资源队列占总内存的百分比 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.default.capacity</name> 
	<value>30</value> 
	</property> 
	<!-- 设置 queueA 资源队列占总内存的百分比 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueA.capacity</name> 
	<value>40</value> 
	</property> 
	<!-- 设置 queueB 资源队列占总内存的百分比 --> <property> 
	<name>yarn.scheduler.capacity.root.queueB.capacity</name> 
	<value>30</value> 
	</property> 
	
	
	<!-- default 资源队列中每个用户可以使用的资源限制,范围0-1,默认1--> 
	<property> 
	<name>yarn.scheduler.capacity.root.default.user-limit-factor</name> 
	<value>1</value> 
	</property> 
	<!-- queueA 资源队列中每个用户可以使用的资源限制,范围0-1,默认1--> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueA.user-limit-factor</name> 
	<value>1</value> 
	</property> 
	<!-- queueB 资源队列中每个用户可以使用的资源限制,范围0-1,默认1--> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueB.user-limit-factor</name> 
	<value>1</value> 
	</property> 
	
	
	<!-- 设置defalut资源队列最大使用资源容量,默认100% --> 
	<property> 
	<name>yarn.scheduler.capacity.root.default.maximum-capacity</name> 
	<value>60</value> 
	</property> 
	<!-- 设置 queueA 资源队列最大使用资源容量,默认100% --> <property> 
	<name>yarn.scheduler.capacity.root.queueA.maximum-capacity</name> 
	<value>80</value> 
	</property> 
	<!-- 设置 queueB 资源队列最大使用资源容量,默认100% --> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueB.maximum-capacity</name> 
	<value>60</value> 
	</property> 
	
	
	<!-- default 资源队列状态 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.default.state</name> 
	<value>RUNNING</value> 
	</property> 
	<!-- queueA 资源队列状态 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueA.state</name> 
	<value>RUNNING</value> 
	</property> 
	<!-- queueB 资源队列状态 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueB.state</name> 
	<value>RUNNING</value> 
	</property> 
	
	
	<!-- 哪些用户可以向 default 资源队列提交作业--> 
	<property> 
	<name>yarn.scheduler.capacity.root.default.acl_submit_applications</name> 
	<value>*</value> 
	</property> 
	<!-- 哪些用户可以向 queueA 资源队列提交作业--> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueA.acl_submit_applications</name> 
	<value>*</value> 
	</property> 
	<!-- 哪些用户可以向 queueB 资源队列提交作业--> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueB.acl_submit_applications</name> 
	<value>*</value> 
	</property> 
	
	
	<!-- 哪些用户可以管理资源队列 default --> 
	<property> 
	<name>yarn.scheduler.capacity.root.default.acl_administer_queue</name> 
	<value>*</value> 
	</property> 
	<!-- 哪些用户可以管理资源队列 queueA--> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueA.acl_administer_queue</name> 
	<value>*</value> 
	</property> 
	<!-- 哪些用户可以管理资源队列 queueB--> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueB.acl_administer_queue</name> 
	<value>*</value> 
	</property> 
	
	<!-- defalut 资源队列中,哪些用户有权提交任务时指定任务优先级 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.default.acl_application_max_priority</name> 
	<value>*</value> 
	</property> 
	<!-- queueA资源队列中,哪些用户有权提交任务时指定任务优先级 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueA.acl_application_max_priority</name> 
	<value>*</value> 
	</property> 
	<!-- queueB资源队列中,哪些用户有权提交任务时指定任务优先级 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueB.acl_application_max_priority</name> 
	<value>*</value> 
	</property> 
	
	<!-- default资源队列中 任务最大的运行时间,超过该时间任务被kill,默认-1,表示禁用 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.default.maximum-application-lifetime </name> 
	<value>-1</value> 
	</property> 
	<!-- queueA 资源队列中 任务最大的运行时间,超过该时间任务被kill,默认-1,表示禁用 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueA.maximum-application-lifetime </name> 
	<value>-1</value> 
	</property> 
	<!-- queueB资源队列中 任务最大的运行时间,超过该时间任务被kill,默认-1,表示禁用 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueB.maximum-application-lifetime </name> 
	<value>-1</value> 
	</property> 
	
	<!-- default资源队列中,任务默认生存时间,当没有设置maximum-application-lifetime时间时,使用该参数,配置不能超过maximum-application-lifetime值 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.default.default-application-lifetime </name> 
	<value>-1</value> 
	</property> 
	<!-- default资源队列中,任务默认生存时间,当没有设置maximum-application-lifetime时间时,使用该参数,配置不能超过maximum-application-lifetime值 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueA.default-application-lifetime </name> 
	<value>-1</value> 
	</property> 
	<!-- default资源队列中,任务默认生存时间,当没有设置maximum-application-lifetime时间时,使用该参数,配置不能超过maximum-application-lifetime值 --> 
	<property> 
	<name>yarn.scheduler.capacity.root.queueB.default-application-lifetime </name> 
	<value>-1</value> 
	</property> 
... ... 
</configuration>

以上配置文件配置完成后,要发送到所有Yarn节点。

2) 修改yarn各个节点的$HADOOP_HOME/etc/hadoop/yarn-site.xml

yarn-site.xml配置文件中追加配置yarn.resourcemanager.scheduler.class为:org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler

... ...
<!-- 配置资源调度器为CapacityScheduler -->
<property>
      <name>yarn.resourcemanager.scheduler.class</name>
      <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
... ...

配置好yarn-site.xml后将配置发送到其他各个Yarn节点。

3) 重启Yarn集群

修改yarn-site.xml后,需要重启Yarn集群,配置才会生效。但是如果在Yarn集群中只是修改了capacity-scheduler.xml 中的配置,我们可以执行命令:yarn rmadmin -refreshQueues重新加载资源队列配置,不需要重新启动Yarn集群。

4) 查看Yarn WebUI中的资源队列情况

2.2.3 任务运行到指定资源队列

在向yarn 提交MapReduce任务时可以通过-D 参数来指定mapreduce.job.queuename参数来指定当前任务使用的资源队列,如下提交MR WordCount任务指定使用queueA资源队列。默认任务提交到default资源队列中。

[root@hadoop105 ~]# hadoop jar /opt/module/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount -Dmapreduce.job.queuename=queueA /input/data.txt /output

Yarn WebUI如下,可以看到任务被提交到对应的资源队列中。

2.2.4 任务优先级配置

在Yarn Capacity调度器中我们可以设置任务执行的优先级,在集群资源有限的情况下,优先执行级别高的任务。按照如下步骤配置。

1) 在Yarn各个节点配置$HADOOP_HOME/etc/hadoop/yarn-site.xml

yarn-site.xml中追加如下配置:

... ...
<!-- 定义集群中任务最大的优先级 -->
<property>
      <name>yarn.cluster.max-application-priority</name>
      <value>10</value>
</property>
... ...

yarn-site.xml配置好后,发送到其他各个Yarn节点。

2) 重启Yarn集群

修改yarn-site.xml后,需要重启Yarn集群,配置才会生效。

3) 测试任务优先级

向Yarn集群中提交多个MR PI 任务,最后一个Pi任务通过参数-Dmapreduce.job.priority参数指定优先级别为2(大于0,小于yarn.cluster.max-application-priority配置值即可,指定值越大优先级别越高),那么Yarn集群会优先将资源分配给该任务执行。默认所有任务的执行优先级别为0。

#提交第一个MR pi 任务
[root@hadoop105 ~]# hadoop jar /opt/module/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar pi 15 100

#提交第二个MR pi任务
[root@hadoop105 ~]# hadoop jar /opt/module/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar pi 15 100

#提交第三个MR pi任务
[root@hadoop105 ~]# hadoop jar /opt/module/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar pi 15 100

#提交最后一个MR pi 任务,并指定任务执行优先级别为8
[root@hadoop105 ~]# hadoop jar /opt/module/hadoop-3.3.6/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar pi -Dmapreduce.job.priority=8 15 100

2.3 Fair调度器

Fair调度器(Fair Scheduler)是一个将Yarn资源公平的分配给各个Application的资源调度方式,这种调度方式可以使所有Application随着时间的流逝可以获取相等的资源份额,其设计目标就是根据定义的参数为所有的Application分配公平的资源。

Fair Scheduler 可以在多个资源队列之间进行资源平等共享。如下图,假设有两个资源队列A、B:

a. 当在资源队列A中启动一个Job而资源队列B中没有任务时,A资源队列会获取全部集群资源。

b. 当B资源队列中启动一个Job后,A资源队列中的Job继续运行,不过一会之后连个任务会各自获取一半的集群资源。

c. 如果此时B资源队列中再启动第二个Job,并且其他的Job还在运行,则它将会和B的第一个Job共享B资源队列中的资源,也就是B资源队列的两个Job各自使用集群资源的1/4,而A资源队列中的Job仍然使用集群一半的资源,资源在两个资源队列中平等共享。

FairScheduler资源调度核心思想就是通过资源平分的方式,动态分配资源,无需预先设定资源比例,实现资源分配公平,其特点如下:

  • 支持多租户共享集群。(与Capacity调度器一样)
  • 集群资源由多个资源队列分享。(与Capacity调度器一样)
  • 如果一个资源队列中资源有剩余,可以共享给其他需要资源的队列,但一旦该资源队列有任务提交运行,共享给其他资源队列的资源会及时回收供该资源队列使用。(与Capacity调度器一样)
  • 可以设置队列最小资源,允许将最小份额资源分配给资源队列,保证该资源队列可以启动任务。
  • 默认情况允许所有Application程序运行,也可以限制每个资源队列中同时运行Application的数量。
  • 根据Appliation的配置,抢占和分配资源可以是友好的或者强制的,默认不启用资源抢占。

2.3.1 Fair资源分配策略

Fair Scheduler支持多资源队列,每个资源队列进行资源调度时按照配置指定的权重平均分配资源。在每个资源队列中job的资源调度策略有三种选择:FIFO、Fair(默认)、DRF,这三种Job调度策略解释如下。

  • FIFO:Job按照先进先出进行资源调度,如果该队列中有多个Job,第一个Job分配完资源后,还有资源供第二个Job运行,那么可能存在多个Job并行运行的情况。这种情况下与Capacity调度器一样。
  • Fair:FairScheduler中每个资源队列默认资源调度策略,只基于内存调度分配资源,按照不同Job的使用内存比例平均分配资源。
  • DRF:基于vcores和内调度分配资源。

备注:DFR(Dominant Resource Fairness,主导资源公平性)。

在Yarn中如果进行资源调度时只考虑单一资源类型,如内存,那么这个事情就很简单,只需要将不同资源队列/Job按它们使用的内存量比例进行调度资源即可,FIFO/Fair就是只基于内存进行资源调度分配。然而当涉及多个资源类型时,情况就变得复杂,例如:一个用户的Application需要大量的CPU但使用很少内存,而另一个用户的Application需要很少的CPU但大量的内存,这里不能仅考虑内存比值来进行资源调度分配,否则可能出现资源分配不合理情况,这种情况除了内存之外还要考虑Application的Vcore使用情况,这就可以使用DRF资源分配策略。

DRF(Dominant Resource Fairness,资源分配策略中,会查看每个Application中主导资源(Dominant Resource)是什么,并将其作为集群调度资源的衡量标准。例如:yarn集群中共100个CPU和10TB内存,应用程序A请求容器(2个CPU,300GB内存),应用程序B请求容器(6个CPU,100GB内存)。A的请求是集群的(2%,3%),所以内存是主导资源,B的请求是集群的(6%,1%),所以CPU是主导资源,由于B程序的容器请求主要资源是A程序容器请求主要资源的2倍(6%/3%=2),所以在DRF资源分配策略下,B程序最大可使用在集群2/3资源。

2.3.2 Fair调度器配置

Fair Scheduler 配置涉及到两个文件:yarn-site.xml和fair-scheduler.xml,两个文件都位于$HADOOP_HOME/etc/hadoop/目录下。

1) 在各个Yarn节点配置yarn-site.xml

<!-- 配置资源调度器为FairScheduler -->
    <property>
      <name>yarn.resourcemanager.scheduler.class</name>
      <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
    </property>

    <!--指定公平调度器资源队列配置文件 ,默认文件名为fair-scheduler.xml,通常指定全路径,否则默认在HADOOP_CONF目录下找-->
    <property>
      <name>yarn.scheduler.fair.allocation.file</name>
      <value>/software/hadoop-3.3.6/etc/hadoop/fair-scheduler.xml</value>
    </property>

    <!--是否开启资源抢占-->
    <property>
      <name>yarn.scheduler.fair.preemption</name>
      <value>false</value>
    </property>

对于以上参数的解释如下:

  • yarn.scheduler.fair.allocation.file

配置FairScheduler配置文件,默认名称为fair-scheduler.xml,建议配置全路径,否则默认在HADOOP_CONF目录下找。

  • yarn.scheduler.fair.preemption

该参数指定是否开启资源队列中资源抢占。当一个job提交到繁忙的Yarn集群空队列中时,job并不会马上执行,而是阻塞直到正在运行的job释放系统资源,为了使提交job更快的执行,FairScheduler支持队列间抢占资源。

这里的抢占就是允许Yarn调度器kill掉占用超过其应占份额资源队列的container,以便这些资源可以被分配到应该享有这些份额资源的队列中。可以设置参数yarn.scheduler.fair.preemption为true开启抢占功能,默认为false。值得注意的是,开启抢占资源由于会kill运行的container并会重新运行这些container,所以会降低集群的执行效率。

2) 在各个yarn节点配置fair-scheduler.xml

fair-scheduler.xml配置文件中可以指定配置的资源队列,这里配置2个资源队列,一个是first一个是second,根据实际需要进行配置即可。配置内容如下:

<?xml version="1.0"?>
<allocations>
  <!--增加一个资源队列,名称为frist -->
  <queue name="first">
    <!--资源队列中使用最小资源-->
    <minResources>1024 mb,1vcores</minResources>
    <!--资源队列中使用最大资源-->
    <maxResources>12000 mb,12vcores</maxResources>
    <!--资源队列中最多同时运行的application个数,默认50-->
    <maxRunningApps>50</maxRunningApps>
    <!--资源队列中ApplicationMaster占用资源的最大比例-->
    <maxAMShare>0.5</maxAMShare>
    <!--资源队列的权重,默认为1-->
    <weight>1.0</weight>
    <!--资源队列内资源分配策略,支持FIFO/Fair/DRF三种-->
    <schedulingPolicy>fair</schedulingPolicy>
  </queue>

  <queue name="second">
    <!--资源队列中使用最小资源-->
    <minResources>1024 mb,1vcores</minResources>
    <!--资源队列中使用最大资源-->
    <maxResources>12000 mb,12vcores</maxResources>
    <!--资源队列中最多同时运行的application个数,默认50-->
    <maxRunningApps>50</maxRunningApps>
    <!--资源队列中ApplicationMaster占用资源的最大比例-->
    <maxAMShare>0.5</maxAMShare>
    <!--资源队列的权重,默认为1-->
    <weight>1.0</weight>
    <!--资源队列内资源分配策略,支持FIFO/Fair/DRF三种-->
    <schedulingPolicy>fair</schedulingPolicy>
  </queue>


  <!--单个资源队列中ApplicationMaster占用资源的最大比例,取值0-1 -->
  <queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
  <!--单个资源队列可以使用的资源最大值 -->
  <queueMaxResourcesDefault>12000 mb,12vcores</queueMaxResourcesDefault>


  <!--任务队列分配匹配调度策略,可以配置多层规则,从上到下依次匹配直到匹配成功-->
  <queuePlacementPolicy>
    <!--提交任务时指定资源队列,没有指定时匹配下一个规则,create 为false表示匹配不上不自动创建对应资源队列-->
    <rule name="specified" create="false"/>
    <rule name="default" queue="default"/>
  </queuePlacementPolicy>
</allocations>

以上配置中关于queuePlacementPolicy参数的解释如下:

  • 每个资源队列中maxAMShare参数这里设置为0.5,目的是满足ApplicationMaster所需资源,可以正常提交任务执行。
  • 在调度任务队列中的任务时,该参数包含一系列任务调度策略,告诉Fair Scheduler调度器如何将传入的Application放置到资源队列中,按照列出的规则依次匹配,直到匹配成功。每条规则都可以指定create参数,true表示当匹配不上此条规则时自动创建对应的资源队列,false为不创建。改参数设置为false时,匹配不上会自动匹配下一个规则。最后一个规则只能设置为匹配default资源队列(Yarn中默认就有此资源队列)或者reject(匹配不上拒绝该任务执行)规则。常用的匹配规则如下:
    • specified:将Application放入其请求的资源队列中,如果没有指定请求的资源队列,则继续匹配下一个。
    • user:将Application放入到以提交者用户名命名的资源队列中,用户名中的点将被替换成dot,例如:first.last用户提交任务匹配的资源队列名称为first_dot_last。
    • primaryGroup:将Application放入与提交者主要组名命名的资源队列中,组命中的点将替换为dot,例如:one.two组的队列名称是one_dot_two。
    • default:将Application放在默认规则的资源队列中,默认default。
    • reject:拒绝Application。

3) 重启Yarn集群

以上配置好yarn-site.xml、fair-scheduler.xml文件后分发到yarn各个节点。然后重启Yarn集群。

2.4 Yarn三种资源调度器特点及使用场景

Yarn资源调度器特点适用场景
FIFO调度器1)简单易懂,无需额外配置。2)应用按照提交的先后顺序(先进先出)运行。3)不适合共享集群,每个应用必须等待直到轮到自己运行。非共享集群,对任务执行顺序要求不高的场景。生产环境一般不用。
Capacity调度器(开源Yarn默认使用)1)允许多个组织共享集群资源,每个组织拥有专门的队列。2)支持队列的层次划分,以及队列资源的灵活配置。3)可以限制队列的最大容量,缓解资源竞争。共享集群的场景,多个组织或团队共享同一集群资源的情况。
Fair调度器(CDH默认使用)1)公平地为所有运行的应用分配资源,支持多个队列间的资源公平共享。2)支持动态创建队列,并通过一套规则系统确定应用的放置位置。3)支持资源的抢占功能,确保资源的公平分配。1) 多个用户或组织在共享集群中需要公平地获得资源的场景。2) 对队列级别的资源控制和细粒度调度策略要求较高的环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值