3 公平调度器案例
3.1 需求
创建两个队列,分别是test和atguigu(以用户所属组命名)。期望实现以下效果:若用户提交任务时指定队列,则任务提交到指定队列运行;若未指定队列,test用户提交的任务到root.group.test队列运行,atguigu提交的任务到root.group.atguigu队列运行(注:group为用户所属组)。
公平调度器的配置涉及到两个文件,一个是yarn-site.xml,另一个是公平调度器队列分配文件fair-scheduler.xml(文件名可自定义)。
(1)配置文件参考资料:
https://hadoop.apache.org/docs/r3.1.3/hadoop-yarn/hadoop-yarn-site/FairScheduler.html
(2)任务队列放置规则参考资料:
https://blog.cloudera.com/untangling-apache-hadoop-yarn-part-4-fair-scheduler-queue-basics/
3.2 配置多队列的公平调度器
1)修改yarn-site.xml文件,加入以下参数
<property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> <description>配置使用公平调度器</description> </property> <property> <name>yarn.scheduler.fair.allocation.file</name> <value>/opt/module/hadoop-3.1.3/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 atguigu 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> <!-- 增加一个队列atguigu --> <queue name="atguigu" type="parent"> <!-- 队列最小资源 --> <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>
3)分发配置并重启Yarn
[atguigu@hadoop102 hadoop]$ xsync yarn-site.xml [atguigu@hadoop102 hadoop]$ xsync fair-scheduler.xml [atguigu@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh [atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh
3.3 测试提交任务
1)提交任务时指定队列,按照配置规则,任务会到指定的root.test队列
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi -Dmapreduce.job.queuename=root.test 1 1
2)提交任务时不指定队列,按照配置规则,任务会到root.atguigu.atguigu队列
[atguigu@hadoop102 hadoop-3.1.3]$ hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1