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

相关推荐
MasterNeverDown2 小时前
如何将 DotNetFramework 项目打包成 NuGet 包并发布
大数据·hadoop·hdfs
中科岩创2 小时前
广西钦州刘永福故居钦江爆破振动自动化监测
大数据·物联网
大数据编程之光3 小时前
Flink-CDC 全面解析
大数据·flink
GZ_TOGOGO4 小时前
华为大数据考试模拟真题(附答案)题库领取
大数据·华为
王子良.6 小时前
大数据生态系统:Hadoop(HDFS)、Hive、Spark、Flink、Kafka、Redis、ECharts、Zookeeper之间的关系详解
大数据·hive·hadoop·经验分享·学习·hdfs·spark
大力财经6 小时前
激发本地生意,抖音生活服务连锁商家生意同比增长超80%
大数据·人工智能
weixin_437398216 小时前
Elasticsearch学习(1) : 简介、索引库操作、文档操作、RestAPI、RestClient操作
java·大数据·spring boot·后端·学习·elasticsearch·全文检索
安的列斯凯奇7 小时前
Elasticsearch—索引库操作(增删查改)
大数据·elasticsearch·搜索引擎
金州饿霸7 小时前
hadoop-yarn常用命令
大数据·前端·hadoop
SeaTunnel8 小时前
对话新晋 Apache SeaTunnel Committer:张圣航的开源之路与技术洞察
大数据