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) 对队列级别的资源控制和细粒度调度策略要求较高的环境。 |