一、需求
创建两个队列,分别是test和atguigu
(以用户所属组命名)。期望实现以下效果:若用户提交任务时指定队列,则任务提交到指定队列运行;若未指定队列,test
用户提交的任务到root.group.test
队列运行,atguigu
提交的任务到root.group.atguigu
队列运行(注:group
为用户所属组)。
公平调度器的配置涉及到两个文件,一个是yarn-site.xml
另一个是公平调度器队列分配文件fair-scheduler.xml
(文件名可自定义)。
公平调度器,一般应用于大型企业
。
二、公平调度器的配置
虚拟机配置
配置多队列的公平调度器
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>
fair-scheduler.xml
这个文件的存放位置,由yarn-site.xml
中指定
<?xml version="1.0"?>
<allocations>
<!-- 单个队列中Application Master占用资源的最大比例,取值0-1 ,企业一般配置0.1 -->
<queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
<!-- 单个队列最大资源的默认值 test atguigu default -->
<queueMaxResourcesDefault>2048mb,2vcores</queueMaxResourcesDefault>
<!-- 增加一个队列test -->
<queue name="test">
<!-- 队列最小资源 -->
<minResources>1024mb,1vcores</minResources>
<!-- 队列最大资源 -->
<maxResources>2048mb,2vcores</maxResources>
<!-- 队列中最多同时运行的应用数,默认50,根据线程数配置 -->
<maxRunningApps>2</maxRunningApps>
<!-- 队列中Application Master占用资源的最大比例 -->
<maxAMShare>0.5</maxAMShare>
<!-- 该队列资源权重,默认值为1.0 -->
<weight>1.0</weight>
<!-- 队列内部的资源分配策略 -->
<schedulingPolicy>fair</schedulingPolicy>
</queue>
<!-- 增加一个队列atguigu -->
<queue name="atguigu" type="parent">
<!-- 队列最小资源 -->
<minResources>1024mb,1vcores</minResources>
<!-- 队列最大资源 -->
<maxResources>2048mb,2vcores</maxResources>
<!-- 队列中最多同时运行的应用数,默认50,根据线程数配置 -->
<maxRunningApps>2</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>
上传102服务器,分发到103、104,并重启Hadoop
公平调度器配置的官网地址:Untangling Apache Hadoop YARN, Part 4: Fair Scheduler Queue Basics
三、测试
命令1
指定test
队列
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
不指定队列,默认在atguitu队列
创建任务
hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1
四、可能的错误
由于我的电脑配置不是很高,给VMWare
配置的是2G2C
的。
所以,一开始,导致公平调度器执行任务卡主
。
错误如下:
从报错可以看出,任务卡在了创建AM Container
,内存不够
。
于是修改如下配置:
<queueMaxAMShareDefault>1</queueMaxAMShareDefault>
<maxAMShare>1</maxAMShare>
这样修改后,任务就在Yarn
页面出现了
但是,依然跑不动。
总的来说,就是内存不够
导致的。
正常使用上述配置,最好给虚拟机分配4G4C
。
所以,配置公平调度器,一定要结合机器的内存和CPU核数进行配置。