Yarn中多队列的配置以及更换公平调度器

参考文献:Hadoop Yarn 调度器多队列 - SpringCore - 博客园

Yarn增加新队列-----hive向Yarn提交任务后,Hadoop再次向Yarn提交任务阻塞_yarn新增队列-CSDN博客

首先为什么要配置多队列呢?当我们使用 yarn 的时候,一个任务提交后,另一个任务也提交,有可能第二个任务提交成功了,但是迟迟不运行,原因是我们默认的调度器,只有一个队列,队列中假如有一个大任务,会阻塞后面的小的任务的运行。

提交第二个任务:

所以我们需要调整 yarn 的队列,要么更换调度器,要么添加队列,以下根据两个情况,分别进行演示。

一.容量调度器多队列

1.为何需要多队列

  1. 调度器默认就1个default队列,不能满足生产的要求。
  2. 1个队列在任务极限的情况下,容易资源耗尽。
  3. 特殊时期通过对任务的区分可以保证重要的任务队列资源充足
    • 按照框架区分队列,如hive/spark/flink 每个框架的任务放入指定的队列(企业用的不是特别多)
    • 按照业务模块区分队列,主流。

2.配置容量调度器的多队列

在capacity-scheduler.xml中配置

capacity-scheduler.xml位于$HADOOP_HOME/etc/hadoop下

1.修改如下属性

XML 复制代码
<!-- 指定多队列,增加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.增加如下属性

XML 复制代码
<!--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刷新队列,就可以看到两条队列。

通过 8088 端口查看队列数据:

3.向Hive队列提交任务

1.hadoop jar的方式

hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.1.jar wordcount -D mapreduce.job.queuename=hive /input/README.txt /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文件,增加以下参数

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

二、公平调度器

公平调度器的配置涉及到两个文件,一个是yarn-site.xml,另一个是公平调度器队列分配文件 fair-scheduler.xml(文件名可自定义)

1.配置公平调度器的多队列

1.修改yarn-site.xml文件,加入以下参数

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>/opt/installs/hadoop/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 复制代码
<?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>

    <!-- 增加一个队列 laoyan -->
    <queue name="laoyan">
        <!-- 队列最小资源 -->
        <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

相关推荐
jlting1951 小时前
读取mysql、kafka数据筛选后放入mysql
大数据·sql·mysql·flink·kafka·database
Mephisto.java2 小时前
【大数据学习 | Spark-Core】RDD的五大特性(包含宽窄依赖)
大数据·学习·spark
十二点的泡面2 小时前
spark 写入mysql 中文数据 显示?? 或者 乱码
大数据·mysql·spark
zmd-zk4 小时前
kafka命令的使用——主题命令(topic)
大数据·分布式·学习·kafka
易云码4 小时前
医疗数据质量安全,数据安全解决方案,医院关心的数据安全问题,信息安全方案(Word原件)
大数据·数据仓库·安全·系统安全·智慧城市
Natural_yz5 小时前
大数据学习18之Spark-SQL
大数据·学习·spark
Yz98767 小时前
Hive的基础函数
大数据·数据仓库·hive·hadoop·数据库开发·big data
李昊哲小课7 小时前
springboot整合hive
大数据·数据仓库·hive·spring boot·后端·数据分析
Mephisto.java7 小时前
【大数据学习 | Spark-Core】Spark中的join原理
大数据·redis·sql·oracle·spark·json·database