Hadoop-之yarn容量调度器之多队列配置与解读

本文详细解读了Hadoop YARN的容量调度器,介绍了默认的CAPACITY_SCHEDULER,重点讲解了如何配置不同调度策略、任务并行度限制、多队列设置以及为特定Application指定队列。还分享了解决内存瓶颈和队列权限管理的方法。
摘要由CSDN通过智能技术生成

摘要:Hadoop-之yarn容量调度器之多队列配置与解读 前言 通常来说Yarn作为一个资源管理器,可以给不同类型的Application分配资源,并合理调度job执行,Yarn支持的调度策略有3种。 FIFO SCHEDULERCAPACITY SCHEDULERFAIR SCHEDULER 但是默认是CAPA…

Hadoop-之yarn容量调度器之多队列配置与解读

前言

通常来说Yarn作为一个资源管理器,可以给不同类型的Application分配资源,并合理调度job执行,Yarn支持的调度策略有3种。

  • FIFO SCHEDULER
  • CAPACITY SCHEDULER
  • FAIR SCHEDULER

但是默认是CAPACITY SCHEDULER容量调度器,该调度器支持多个队列,每个队列中至多同时运行1个Application(一个Hive-MR进程或者Spark进程都会为各自申请Application Master,然后申请资源,然后分发Task,然后分布式执行)。

1 如何配置Yarn的调度器类型

如果不配置,默认使用capicity scheduler调度器,如果需要指定其它的调度类型,我们需要通过yarn-site.xml进行配置,如Fair调度器配置如下。

<!--配置公平调度器-->
<property>
  <name>yarn.resourcemanager.scheduler.class</name>
  <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>

其它公平调度器的配置请参考:https://hadoop.apache.org/docs/r2.10.1/hadoop-yarn/hadoop-yarn-site/FairScheduler.html

2 容量调度器之任务并行度

通常一个Yarn集群能够调度的总内存为所有NodeManager能够被Yarn调度的总内存的和,通常通过在yarn-site.xml中配置以下信息。

NOTE:Capacity Scheduler的默认队列的个数为1个,名称为default

<!--每个nodemanager能分配给container的物理内存大小-->
<property>
     <name>yarn.nodemanager.resource.memory-mb</name>
     <value>4096</value>
</property>

我们来看一下以下状况,现在同时基于Yarn调度启动了2个进程,一个规划式的Spark-SQL进程,同时启动了一个Hive的MR任务,明明内存只用了33%,为什么Hive的MR任务卡住不动了。
在这里插入图片描述
在这里插入图片描述
Note:因为使用的容量调度器,容量调度器有一个参数,控制着Application Master占用的总内存不能超过Yarn能调度内存的10%,所以当Spark的APPMaster启动之后占用了8%,此时没有问题,但是之后又启动了一个HiveMR,此时申请启动APPMaster的时候,Yarn会推断,假如再启动一个APPMaster,那么AppMaster的占用内存就超出了10%,所以此时申请被阻塞,等待其它进程内存释放,这个参数如下。

<!-- vim capacity-scheduler.xml -->
<property>
    <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
    <value>0.1</value>
    <description>
        这是集群中能被用于启动APPMaster的最大内存占比,这控制着并行运行的应用数量
        Maximum percent of resources in the cluster which can be used to run
        application masters i.e. controls number of concurrent running
        applications.
    </description>
</property>
<!-- 可以适当调大该值的大小,针对公司任务进行优化 -->

3 容量调度器之多队列配置

为了避免只有一个队列导致任务串行的问题,我们可以指定多队列配置,具体配置如下。

<!--1、这个队列层级实际上是一个树的结构-->
  <property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default,spark,flink</value>
    <description>
      The queues at the this level (root is the root queue).
    </description>
  </property>
<!--2、以下是为上面的的3个队列分别分配资源容量占比,加起来要为100,不然RsourceManager无法启动,日志异常如下-->
  <property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
    <value>30</value>
    <description>Default queue target capacity.</description>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.spark.capacity</name>
    <value>40</value>
    <description>spark queue target capacity.</description>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.flink.capacity</name>
    <value>30</value>
    <description>flink queue target capacity.</description>
  </property>
<!--3、队列添加之后默认是关闭的,我们需要将配置的所有队列都设置成RUNNING状态,否则就不能添加任务-->
  <property>
    <name>yarn.scheduler.capacity.root.default.state</name>
    <value>RUNNING</value>
    <description>
      The state of the default queue. State can be one of RUNNING or STOPPED.
    </description>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.spark.state</name>
    <value>RUNNING</value>
    <description>
      The state of the spark queue. State can be one of RUNNING or STOPPED.
    </description>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.flink.state</name>
    <value>RUNNING</value>
    <description>
      The state of the flink queue. State can be one of RUNNING or STOPPED.
    </description>
  </property>

<!--4、假如default队列自己资源不够时,可以借用其它空闲队列的资源,最多可以扩展到整个集群资源的80%--> 
<property>
    <name>yarn.scheduler.capacity.root.default.maximum-capacity</name>
    <value>80</value>
    <description>
        The maximum capacity of the default queue.
    </description>
</property>

<!--5、为用户可以访问default的权限控制的,也可以为其它的队列配置权限信息,其中*代表所有人都能访问 。-->
  <property>
    <name>yarn.scheduler.capacity.root.default.acl_submit_applications</name>
    <value>*</value>
    <description>
      The ACL of who can submit jobs to the default queue.
    </description>
  </property>
  <property>
    <name>yarn.scheduler.capacity.root.default.acl_administer_queue</name>
    <value>*</value>
    <description>
      The ACL of who can administer jobs on the default queue.
    </description>
  </property>

<!--6、同时还能配置任务超时时长等信息-->
......

日志异常:

2021-01-23 21:07:59,050 FATAL org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: Error starting ResourceManager
java.lang.IllegalArgumentException: Illegal capacity of -1.0 for queue root.spark at org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacitySchedulerConfiguration.getNonLabeledQueueCapacity(CapacitySchedulerConfiguration.java:335)
.......
org.apache.hadoop.yarn.server.resourcemanager.ResourceManager: SHUTDOWN_MSG:

更多细节请参考:https://hadoop.apache.org/docs/r2.10.1/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html

在配置完队列之后,重新启动yarn,此时我们会看到WebUi的监控页面的队列信息如下图,说明配置生效。
在这里插入图片描述

4 为不同Application指定队列名称

hadoop内部已经包含测试新队列的jar包,我们可以通过以下方式进行测试。

#指定新建的spark队列进行任务的提交
hadoop jar /opt/module/hadoop-2.7.7/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.7.jar pi -Dmapreduce.job.queuename=spark 1 1

#或者通过spark queue启动spark应用任务
bin/spark-sql --master yarn --queue spark

#sqoop指定对应的队列
bin/sqoop import \
-Dmapreduce.job.queuename=default \
--connect ...

#为lzo文件创建索引开启切片动能指定queue
hadoop jar $lzojar  $main_class -Dmapreduce.job.queuename=default $target_dir


#通过hive命令行指定queue
hive
>set mapreduce.job.queuename=default  #默认就是default
HadoopYARN(Yet Another Resource Negotiator)系统中的容量调度配置是在`yarn-site.xml`文件中进行管理的。这个文件通常位于Hadoop安装目录下的`conf`子目录下,对于默认安装路径来说,它可能在 `/etc/hadoop/conf/yarn-site.xml` 或 `c:\Program Files\Hadoop\hadoop-yarn\conf\yarn-site.xml` 这样的位置,具体取决于你的操作系统和Hadoop的安装路径。 要在`yarn-site.xml`中配置队列容量调度器,你需要添加一些关键属性。例如,`queueA`、`queueB`等代表各个队列,`capacity`属性用于设置每个队列的资源比例。以下是部分相关的配置示例: ```xml <property> <name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value> </property> <!-- 队列配置 --> <queue> <id>queueA</id> <min-user-limit-percent>10</min-user-limit-percent> <max-capacity>50</max-capacity> </queue> <queue> <id>queueB</id> <min-user-limit-percent>5</min-user-limit-percent> <max-capacity>50</max-capacity> </queue> <!-- 全局队列容量配置 --> <property> <name>yarn.scheduler.capacity.root.default.capacity</name> <value>90</value> </property> <property> <name>yarn.scheduler.capacity.root.queueA.capacity</name> <value>40</value> </property> <property> <name>yarn.scheduler.capacity.root.queueB.capacity</name> <value>10</value> </property> ``` 记得在修改完配置后重启YARN服务,以便新的设置生效。如果你遇到具体的配置问题,可以在`--related questions--`部分提问关于如何查看和编辑这个文件,或者某个配置项的具体含义。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值