Hadoop Yarn 调度器多队列

1.容量调度器多队列

1.为何需要多队列

  1. 调度器默认就1个default队列,不能满足生产的要求。
  2. 1个队列在任务极限的情况下,容易资源耗尽。
  3. 特殊时期通过对任务的区分可以保证重要的任务队列资源充足
    • 按照框架区分队列,如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(文件名可自定义)

  1. 配置文件参考资料
    Hadoop: Fair Scheduler
  2. 任务队列放置规则参考资料
    理清 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>

3.将配置文件拷贝到各个节点替换并重启Yarn

posted @ 2023-12-17 14:47  SpringCore  阅读(30)  评论(0编辑  收藏  举报