Hadoop Yarn 调度器多队列
1.容量调度器多队列
1.为何需要多队列
- 调度器默认就1个default队列,不能满足生产的要求。
- 1个队列在任务极限的情况下,容易资源耗尽。
- 特殊时期通过对任务的区分可以保证重要的任务队列资源充足
- 按照框架区分队列,如hive/spark/flink 每个框架的任务放入指定的队列(企业用的不是特别多)
- 按照业务模块区分队列,主流。
2.配置容量调度器的多队列
1.在capacity-scheduler.xml中配置
capacity-scheduler.xml
位于$HADOOP_HOME/etc/hadoop下
1.修改如下属性
<!-- 指定多队列,增加hive队列 -->
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>default,hive</value>
<description>
The queues at the this level (root is the root queue).
</description>
</property>
<!--降低default队列资源额定容量为40%,默认100%-->
<property>
<name>yarn.scheduler.capacity.root.default.capacity</name>
<value>40</value>
<description>Default queue target capacity.</description>
</property>
<!--降低default队列资源最大容量为60%,默认100%-->
<property>
<name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
<value>60</value>
<description>
The maximum capacity of the default queue.
</description>
</property>
2.增加如下属性
<!--hive队列资源额定容量为60%-->
<property>
<name>yarn.scheduler.capacity.root.hive.capacity</name>
<value>60</value>
<description>hive queue target capacity.</description>
</property>
<!--同一个用户向队列提交任务时可以占用资源到多少-->
<property>
<name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
<value>1</value>
<description>
hive queue user limit a percentage from 0.0 to 1.0.
</description>
</property>
<!--hive队列资源最大容量为80%-->
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
<value>80</value>
<description>
The maximum capacity of the hive queue.
</description>
</property>
<!--hive队列的运行状态-->
<property>
<name>yarn.scheduler.capacity.root.hive.state</name>
<value>RUNNING</value>
<description>
The state of the hive queue. State can be one of RUNNING or STOPPED.
</description>
</property>
<!--限定向队列提交任务的用户名-->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
<value>*</value>
<description>
The ACL of who can submit jobs to the hive queue.
</description>
</property>
<!--限定可以操作队列(查看/杀死)[管理员]的用户名-->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
<value>*</value>
<description>
The ACL of who can administer jobs on the hive queue.
</description>
</property>
<!--哪些用户可以设置任务提交的优先级-->
<property>
<name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
<value>*</value>
<description>
The ACL of who can submit applications with configured priority.
For e.g, [user={name} group={name} max_priority={priority} default_priority={priority}]
</description>
</property>
<!--任务最大的生命周期,如果application指定了超时时间,则提交到该队列的application能够指定的最大超时时间不能超过该值-->
<property>
<name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime
</name>
<value>-1</value>
</property>
<!--如果application没指定超时时间,则用default-application-lifetime作为默认值-->
<property>
<name>yarn.scheduler.capacity.root.hive.default-application-lifetime
</name>
<value>-1</value>
</property>
2.将配置文件拷贝到各个节点替换
3.重启Yarn或者执行yarn rmadmin -refreshQueues
刷新队列,就可以看到两条队列。
3.向Hive队列提交任务
1.hadoop jar的方式
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar wordcount -D mapreduce.job.queuename=hive /input /output
注:-D表示运行时改变参数值
2.打jar包的方式
默认的任务提交都是提交到default队列的,如果希望向其他队列提交任务,需要在驱动类中声明:
// 1.获取job
Configuration conf = new Configuration();
conf.set("mapreduce.job.queuename","hive");
Job job = Job.getInstance(conf);
4.任务的优先级
容量调度器,支持任务优先级的配置,在资源紧张时,优先级高的任务将优先获取资源
默认情况下,Yarn将所有任务的优先级限制为0,若想使用任务的优先级功能,需要先开放该限制。
1.修改yarn-site.xml文件,增加以下参数
<!--配置有5个优先级,优先级为5的任务为最高优先级-->
<property>
<name>yarn.cluster.max-application-priority</name>
<value>5</value>
</property>
2.将配置文件拷贝到各个节点替换并重启Yarn
3.提交优先级高的任务
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar pi -D mapreduce.job.priority=5 5 2000000
2.公平调度器
公平调度器的配置涉及到两个文件,一个是yarn-site.xml,另一个是公平调度器队列分配文件 fair-scheduler.xml(文件名可自定义)
- 配置文件参考资料
Hadoop: Fair Scheduler - 任务队列放置规则参考资料
理清 Apache Hadoop YARN,第 4 部分:公平调度程序队列基础知识
1.配置公平调度器的多队列
1.修改yarn-site.xml文件,加入以下参数
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
<description>配置Yarn使用公平调度器</description>
</property>
<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>/usr/hadoop/hadoop-3.3.6/etc/hadoop/fair-scheduler.xml</value>
<description>指定公平调度器队列分配的配置文件</description>
</property>
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>false</value>
<description>禁止队列中资源抢占</description>
</property>
2.配置fair-scheduler.xml
<?xml version="1.0"?>
<allocations>
<!-- 单个队列中 Application Master占用资源的最大比例,取值0-1,企业一般配置0.1 -->
<queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
<!-- 单个队列最大资源的默认值 test coreqi default -->
<queueMaxResourcesDefault>4096mb,4vcores</queueMaxResourcesDefault>
<!-- 增加一个队列 test -->
<queue name="test">
<!-- 队列最小资源 -->
<minResources>2048mb,2vcores</minResources>
<!-- 队列最大资源 -->
<maxResources>4096mb,4vcores</maxResources>
<!-- 队列中最多同时运行的应用数,默认50,根据线程数配置 -->
<maxRunningApps>4</maxRunningApps>
<!-- 队列中 Application Master占用资源的最大比例 -->
<maxAMShare>0.5</maxAMShare>
<!-- 该队列资源权重,默认值1.0 -->
<weight>1.0</weight>
<!-- 队列内部的资源分配策略 -->
<schedulingPolicy>fair</schedulingPolicy>
</queue>
<!-- 增加一个队列 coreqi -->
<queue name="coreqi">
<!-- 队列最小资源 -->
<minResources>2048mb,2vcores</minResources>
<!-- 队列最大资源 -->
<maxResources>4096mb,4vcores</maxResources>
<!-- 队列中最多同时运行的应用数,默认50,根据线程数配置 -->
<maxRunningApps>4</maxRunningApps>
<!-- 队列中 Application Master占用资源的最大比例 -->
<maxAMShare>0.5</maxAMShare>
<!-- 该队列资源权重,默认值1.0 -->
<weight>1.0</weight>
<!-- 队列内部的资源分配策略 -->
<schedulingPolicy>fair</schedulingPolicy>
</queue>
<!-- 任务队列分配策略,可配置多层规则,从第一个规则开始匹配,直到匹配成功 -->
<queuePlacementPolicy>
<!-- 提交任务时指定队列,如未指定提交队列,则继续匹配下一个规则;false表示,如果指定队列不存在,不允许自动创建-->
<rule name="specified" create="false"/>
<!-- 提交到 root.group.username队列,若root.group不存在,不允许自动创建;若root.group.user不存在,允许自动创建-->
<rule name="nestedUserQueue" create="true">
<rule name="primaryGroup" create="false"/>
</rule>
<!-- 最后一个规则必须为reject或者default。reject表示拒绝创建提交失败,default表示把任务提交到default队列 -->
<rule name="reject" />
</queuePlacementPolicy>
</allocations>