hadoop3.x yarn 调度策略:Fair Scheduler(公平调度)高级配置

修改yarn-site.xml配置

登录 hadoop2

修改 yarn-site.xml 文件:

vim /program/hadoop-3.0.3/etc/hadoop/yarn-site.xml

增加下面内容:

指定公平调度方式

<!--  指定使用fairScheduler的调度方式  -->
<property>
     <name>yarn.resourcemanager.scheduler.class</name>
     <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

指定配置文件路径

<!--  指定配置文件路径  -->
<property>
     <name>yarn.scheduler.fair.allocation.file</name>
     <value>fair-scheduler.xml</value>
</property>

解释:

  • 默认是 $HADOOP_HOME/etc/hadoop/ 路径,也可以写全路径
  • 默认文件名是:fair-scheduler.xml

开启抢占

<!-- 开启资源抢占,当队列资源使用
yarn.scheduler.fair.preemption.cluster-utilization-threshold 这么多比例的时候,就从其他空闲队列抢占资源,默认为false,即:不抢占
-->
<property>
     <name>yarn.scheduler.fair.preemption</name>
     <value>true</value>
</property>

<property>
     <name>yarn.scheduler.fair.preemption.cluster-utilization-threshold</name>
     <value>0.8f</value>
</property>

linux用户名作为队列名

<property>
    <name>yarn.scheduler.fair.user-as-default-queue</name>
    <value>true</value>
</property>

解释:

  • 默认true,提交任务未指定队列时,默认是将当前linux登录用户名作为队列名。这个配置就实现了根据用户名自动分配资源池

  • 设置成false,当任务中未指定资源池的时候,将使用默认的队列,即:root.default,可在 fair-scheduler.xml 中配置默认队列

禁止创建未定义的队列

<property>
       <name>yarn.scheduler.fair.allow-undeclared-pools</name>
       <value>false</value>
</property>

解释:

  • 默认为true,如果提交任务时指定 没有 的队列,会 自动创建 该队列

  • 设置为false,提交任务时应该指定 已有 的队列

    • 如果指定 没有 的队列,会将该任务分配到 默认队列,一般为:root.default
    • 如果设置了 yarn.scheduler.fair.user-as-default-queue=true,那么提交任务 未指定队列 时,默认是将当前 linux登录用户名 作为队列名

fair-scheduler.xml

新建 fair-scheduler.xml 文件:

vim /program/hadoop-3.0.3/etc/hadoop/fair-scheduler.xml

内容如下:

<?xml version="1.0"?>
<allocations>
    <!-- 定义根队列,所有队列都是root队列的子队列 -->
    <queue name="root">
        <!-- 全局配置 -->
        <!-- 最小使用资源:2G内存,2个处理器核心 -->
        <minResources>2048mb,2vcores</minResources>
        <!-- 最大使用资源:4G内存,2个处理器核心 -->
        <maxResources>4096mb,2vcores</maxResources>
        <!-- 最大可同时运行的app数量:100-->
        <maxRunningApps>10</maxRunningApps>

        <!-- weight:资源池权重 -->
        <weight>1.0</weight>

        <!-- 调度模式:fair-scheduler -->
        <schedulingMode>fair</schedulingMode>

        <!-- 允许提交任务的用户名和组,格式为:用户名 用户组 -->
        <!-- 当有多个用户时候,格式为:用户名1,用户名2      用户名1所属组,用户名2所属组 -->
        <aclSubmitApps> </aclSubmitApps>

        <!-- 允许管理任务的用户名和组,格式同上 -->
        <aclAdministerApps> </aclAdministerApps>

        <!-- 当提交的任务没有指定队列时,都提交到该队列中 -->
        <queue name="default">
            <!-- 该队列的局部配置 -->
            <minResources>1024mb,2vcores</minResources>
            <maxResources>4096mb,2vcores</maxResources>
            <maxRunningApps>5</maxRunningApps>
            <!-- 队列内部使用公平调度,也可以是fifo -->
            <schedulingMode>fair</schedulingMode>
            <!-- 权重,按照该比例抢夺资源 -->
            <weight>2.0</weight>
            <!-- 允许提交任务的用户名和组,格式为:用户名 用户组(只写用户名也行) -->
            <!-- 当有多个用户时候,格式为:用户名1,用户名2   用户名1所属组,用户名2所属组 -->
            <!--  *表示所有用户都可以运行 -->
            <aclSubmitApps>*</aclSubmitApps>
        </queue>

        <queue name="spark">
            <minResources>2048mb,2vcores</minResources>
            <maxResources>4096mb,2vcores</maxResources>
            <maxRunningApps>5</maxRunningApps>
            <schedulingMode>fair</schedulingMode>
            <weight>1.0</weight>
            <!-- 允许提交任务的用户名和组 -->
            <aclSubmitApps>root,spark</aclSubmitApps>
            <!-- 允许管理任务的用户名和组 -->
            <aclAdministerApps>root,spark</aclAdministerApps>
        </queue>

        <queue name="dev">
            <minResources>2048mb,2vcores</minResources>
            <maxResources>4096mb,2vcores</maxResources>
            <maxRunningApps>10</maxRunningApps>
            <schedulingMode>fair</schedulingMode>
            <weight>1.0</weight>
            <!-- 允许提交任务的用户名和组 -->
            <aclSubmitApps>root,spark,flink</aclSubmitApps>
            <!-- 允许管理任务的用户名和组 -->
            <aclAdministerApps>root,spark,flink</aclAdministerApps>
        </queue>

    </queue>
</allocations>

注意:

  • <aclSubmitApps> </aclSubmitApps><aclAdministerApps> </aclAdministerApps>如果是空,必须有空格,否则报空指针错

同步

同步到 hadoop1:

rsync -av /program/hadoop-3.0.3/etc/hadoop/*  root@hadoop1:/program/hadoop-3.0.3/etc/hadoop/

同步到 hadoop3:

rsync -av /program/hadoop-3.0.3/etc/hadoop/*  root@hadoop3:/program/hadoop-3.0.3/etc/hadoop/

重启 yarn

登录 hadoop2,执行下面命令关闭 yarn:

stop-yarn.sh
start-yarn.sh

web 查看队列

访问:http://hadoop2:8088/ ,查看队列,显示界面如下:

可以看到队列 root.defaultroot.devroot.spark

测试

同时 在 hadoop1、hadoop3执行下面命令

hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar wordcount /test2/data.txt   /result010519
hadoop jar ${HADOOP_HOME}/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.3.jar wordcount /test2/data.txt   /result010518

原文出处:https://www.malaoshi.top/show_1IX2XOnbCeyW.html