YARN 资源调度器 CapacityScheduler 原理
csdh11 2025-01-10 12:43 4 浏览
CapacityScheduler 使用了树的结构来管理资源的使用,树的节点类型为 Queue,Queue 你可以理解为就是一个可伸缩的资源池,任务提交申请资源和任务销毁时释放资源都由 Queue 统一管理。
1. 队列类型:
- ParentQueue:非叶子结点包含子节点,管理子队列的状态信息,子队列之间资源的共享等;
- LeafQueue:叶子结点,任务只能提交到叶子节点,校验当前队列状态,运行的任务是否达到最大,用户提交任务数量的校验。
2. 通用队列属性,适用于所有队列
- yarn.scheduler.capacity.maximum-applications:处于 running 和 pending 状态任务的最大数量,默认 10000;
- yarn.scheduler.capacity.max-parallel-apps:任务运行的并发度,默认 int 最大值;
- yarn.scheduler.capacity.resource-calculator:可以限定的资源类型,默认值 org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator 只能用来限定内存,无法限定 CPU,如需同时限定 CPU 和内存需使用 org.apache.hadoop.yarn.util.resource.DominantResourceCalculator;
- yarn.scheduler.maximum-allocation-vcores:每个 container 可申请的最大 vcore,默认 4;
- yarn.scheduler.maximum-allocation-mb:每个 container 可申请的最大内存,默认 8192。
3. 队列私有属性
- yarn.scheduler.capacity.<queue-path>.state:队列状态,RUNNING = 上线的队列,可用来分配任务资源,STOPPED = 下线状态的队列,之前可能上过线现在下线了;
- yarn.scheduler.capacity.<queue-path>.maximum-applications:必须小于等于对应的通用队列属性;
- yarn.scheduler.capacity.<queue-path>.max-parallel-apps:必须小于等于对应的通用队列属性;
- yarn.scheduler.capacity.<queue-path>.capacity:当前队列容量在父队列中的容量占比,这里比较特殊的是 root 根节点,容量始终等于 100 表示 Yarn 可分配的总资源,对某个父队列其所有子队列占比之和为 100,例如 root 子队列事业部1占 20%、事业部2占 50% 和事业部3占 20%。
- yarn.scheduler.capacity.<queue-path>.maximum-capacity:当前队列的容量超过默认容量时,还可以用多少其他队列的容量,如果不配置默认100即可使用父队列容量的全部;
3.1 限定 Container
- yarn.scheduler.capacity.<queue-path>.maximum-allocation-vcores:当前队列中每个 container 可申请的最 大 vcore,这个值必须 <= yarn.scheduler.maximum-allocation-vcores;
- yarn.scheduler.capacity.<queue-path>.maximum-allocation-mb:当前队列中每个 container 可申请的最大内存,这个值必须 <= yarn.scheduler.maximum-allocation-mb。
3.2 限定用户资源
- yarn.scheduler.capacity.<queue-path>.minimum-user-limit-percent:限制用户使用的最小资源占比;
- yarn.scheduler.capacity.<queue-path>.user-limit-factor:用户可扩容的倍数,例如原有占比 10%,如果 该值为 2 那么用户可用的最大资源为 20%。
3.3 限定用户权限
- yarn.scheduler.capacity.root.<queue-path>.acl_submit_applications:可提交任务的用户或用户组;
- yarn.scheduler.capacity.root.<queue-path>.acl_administer_queue:队列的管理权限。
ACL 控制语法:用户之间逗号分隔 + 空格 + 用户组之间逗号分隔。
3.4 用户、用户组和队列的映射
- yarn.scheduler.capacity.queue-mappings:用户提交任务的时候,可以根据用户名称和用户所在用户组限定用户提交的队列,支持多个规则,规则之间以逗号分隔,排在前面的规则优先执行;
- 用户和队列的匹配:u:username:queue;
- 用户组和队列的匹配:g:userGroup:queue;
例如用户 user1 和 user2,user1 所在的用户组 userGroup1,和队列的映射规则:
- user1 -> q1,匹配优先级高
- user2 -> q2
- userGroup1 -> q3
那么配置如下:
<property>
<name>yarn.scheduler.capacity.queue-mappings</name>
<value>u:user1:q1,u:user2:q2,g:userGroup1:q3</value>
</property>
4. 环境部署
配置 CapacityScheduler 队列,要求如下:
- 事业部1队列 q1 资源:20% ~ 30%;
- 子队列 user:40% ~ 50%;
- 子队列 spark:60% ~ 80%;
- 事业部2队列 q2 资源:50% ~ 80%;
- 子队列 query:30% ~ 50%;
- 子队列 export:50% ~ 80%;
- 子队列 merge:20% ~ 30%;
- 事业部3队列 q3 资源:30% ~ 50%;
- 子队列 import:20% ~ 30%;
- 子队列 ai:80% ~ 100%。
4.1 环境搭建
wget https://downloads.apache.org/hadoop/common/hadoop-3.3.6/hadoop-3.3.6.tar.gz
tar -xvf hadoop-3.3.6.tar.gz
cd /home/ice/hadoop-3.3.6/etc/hadoop
# 1. 配置 core-site.xml
cat << EoF > core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
</configuration>
EoF
# 2. 配置 hdfs-site.xml
cat << EoF > hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
EoF
# 3. 配置 mapred-site.xml
cat << EoF > hdfs-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*:$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*</value>
</property>
</configuration>
EoF
# 4. 配置 yarn-site.xml,这里需要用到 CapacityScheduler,同时限制下 Yarn 整体资源为 10GB,主要是好测试
cat << EoF > yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>10240</value>
</property>
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value>
</property>
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
</configuration>
EoF
echo "export JAVA_HOME=/home/ice/jdk1.8.0_191" >> hadoop-env.sh
echo 'export HDFS_NAMENODE_OPTS="-XX:+UseParallelGC -Xmx2g"' >> hadoop-env.sh
echo 'export HDFS_DATANODE_OPTS="-XX:+UseParallelGC -Xmx4g"' >> hadoop-env.sh
# 这里为了可以远程 debug
echo 'export YARN_RESOURCEMANAGER_OPTS="-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9999"' >> yarn-env.sh
# 生成密钥一路回车
ssh-keygen
# 设置免密登录
ssh-copy-id localhost
# 加入到环境变量里面
vim ~/.bash_profile
export HADOOP_HOME=/home/ice/hadoop-3.3.6
export PATH=$HADOOP_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin
source ~/.bash_profile
4.3 配置队列:capacity-scheduler.xml
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>q1,q2,q3</value>
</property>
<!-- q1 及其子队列-->
<property>
<name>yarn.scheduler.capacity.root.q1.queues</name>
<value>user,spark</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.capacity</name>
<value>20</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.maximum-capacity</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.user.capacity</name>
<value>40</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.user.maximum-capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.user.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.spark.capacity</name>
<value>60</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.spark.maximum-capacity</name>
<value>80</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.spark.state</name>
<value>RUNNING</value>
</property>
<!--q2 及其子队列-->
<property>
<name>yarn.scheduler.capacity.root.q2.queues</name>
<value>query,export,merge</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.maximum-capacity</name>
<value>80</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.query.capacity</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.query.maximum-capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.query.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.export.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.export.maximum-capacity</name>
<value>80</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.export.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.merge.capacity</name>
<value>20</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.merge.maximum-capacity</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.merge.state</name>
<value>RUNNING</value>
</property>
<!--q3 及其子队列-->
<property>
<name>yarn.scheduler.capacity.root.q3.queues</name>
<value>import,ai</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.capacity</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.maximum-capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.import.capacity</name>
<value>20</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.import.maximum-capacity</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.import.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.ai.capacity</name>
<value>80</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.ai.maximum-capacity</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.ai.state</name>
<value>RUNNING</value>
</property>
</configuration>
4.4 启动
bin/hdfs namenode -format
sbin/start-dfs.sh
sbin/start-yarn.sh
查看具体配置:hadoop queue -list
5. 场景测试
编写用于测试的脚本:
# 1. 先创建 HDFS 目录
hdfs dfs -mkdir /input
# 2. 放点测试文件
hdfs dfs -put etc/hadoop/*.xml /input
# 3. 运行个原有的样例
hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar grep /input /output 'dfs[a-z.]+'
# 4. 编写脚本 start_test.sh
# 可以设定提交用户和提交队列
queue=${1:-root.q2}
export HADOOP_USER_NAME=${2:-ice}
bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.6.jar pi \
-Dyarn.app.mapreduce.am.resource.mb=2048 \
-Dmapreduce.job.queuename=$queue \
100 100
将测试的队列变得简单一些,复现问题也会容易些:
<!--
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License. See accompanying LICENSE file.
-->
<configuration>
<property>
<name>yarn.scheduler.capacity.user.max-parallel-apps</name>
<value>100</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>q1,q2,q3</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.capacity</name>
<value>20</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q1.user-limit-factor</name>
<value>5</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.capacity</name>
<value>50</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.user-limit-factor</name>
<value>2</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q2.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.capacity</name>
<value>30</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.state</name>
<value>RUNNING</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.q3.user-limit-factor</name>
<value>4</value>
</property>
</configuration>
通过设置 user-limit-factor,用户提交的任务可使用集群所有资源:
- root.q1:0.2 * 5 = 100%;
- root.q2:0.5 * 2 = 100%;
- root.q3:0.3 * 4 = 120% 只能使用 100%。
5.1 单队列单任务
直接启动任务即可:./start_test.sh,默认提交到 root.q1 队列
5.2 单独列多任务
改为后台任务多次执行:
for i in `seq 1 3`; do sh start_test.sh; done;
执行过程中发现同一时刻只能有一个任务执行,主要原因是最开始提交的任务 application_1694433897361_0002 占用了所有资源,导致后续的 application_1694433897361_0003 和 application_1694433897361_0004 只能阻塞。
通过上面的测试可以发现,设定用户使用容量的上线很有必要。
5.3 多队列多任务同时执行
for queue in root.q1 root.q2;do sh start_test.sh $queue;done
运行中发现,不同队列的任务没有发生阻塞:
两个任务执行的状态:
5.4 多队列多任务先后执行
我们让 root.q1 队列任务先执行一会,等其占用到整体资源 100% 时,这时候再提交 root.q2 队列任务:
测试过程中发现,root.q2 等待一段时间后获取到资源,并没有强制的对 root.q1 队列任务 kill,CapacityScheduler 其实不同队列发生资源竞争时,会减少正在运行任务的资源需要等到再次申请资源时,还是很友好的:
所有设置队列的最大上限也是很有必要的,起码不会影响其他队列的执行。
- 上一篇:干货:MAC上轻松搞定查看Java汇编代码
- 下一篇:JVM运行时内存区域划分
相关推荐
- JNDI注入详解
-
JNDI简介JNDI是java命名与目录接口(javaNamingandDirectoryInterface),在J2EE规范中是重要的规范之一。通过调用JNDI的API应用程序可以定位资源和...
- Java 近期新闻:Hibernate 6.0、JobRunr 5.0、JHipster 7.8.0
-
本期Java近期新闻综述内容涉及JDK19、SpringBoot、SpringCVEs、ApacheTomcat点版本、QuarkusToolsforVisualStudio...
- 2023年200多道Java基础面试题
-
最近有很多人后台问我,有什么方法能够快速提升自己,通过阿里、腾讯、字节跳动、京东等互联网大厂的面试,我觉得短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能...
- 完全零基础入门Fastjson系列漏洞
-
一、前置知识1.fastjson怎么用?fastjson是啥百度就有,看了之后不熟悉的人还是会一脸懵逼,我们可以通过以下这个小例子来快速学会使用...
- 解密阿里线上问题诊断工具Arthas和jvm-sandbox
-
大纲目录这篇文章是之前学习Arthas和jvm-sandbox的一些心得和总结,希望能帮助到大家。本文字较多,可以根据目录进行对应的阅读。背景:现在的问题所在?Arthas:Arthas能帮助你干什...
- Java 服务 Docker 容器化最佳实践
-
一、概述当我们在容器中运行Java应用程序时,可能希望对其进行调整参数以充分利用资源。...
- “堆内存持续占用高 且 ygc回收效果不佳” 排查处理实践
-
作者:京东零售王江波说明:部分素材来源于网络,数据分析全为真实数据。一、问题背景自建的两套工具,运行一段时间后均出现内存占用高触发报警,频繁younggc且效果不佳。曾经尝试多次解决,因各种原...
- log4j2 JNDI注入分析笔记
-
前言ApacheLog4j2是一款优秀的Java日志框架,最近爆出了一个jndi注入的漏洞,影响面非常广,各大厂商都被波及。Log4j2作为日志记录的第三方库,被广泛得到使用,这次主要分享一下,最近...
- Linux-常用操作命令介绍
-
1.帮助命令1.1help命令...
- 基于容器的Java内存参数解析
-
在基于物理的服务器(此处主要与容器平台进行区分,故此描述)上运行Java应用程序时,我们通常会使用Java虚拟机参数"-Xms、-Xmx"来指定Java堆内存的初始值和最大值。如果要将...
- 用于处理 PDF 文档的开放源码 Java 工具
-
哈喽,我是老鱼,一名致力于在技术道路上的终身学习者、实践者、分享者!...
- Log4j 严重漏洞修最新修复方案参考
-
CVE-2021-44228,原理上是log4j-core代码中的JNDI注入漏洞。这个漏洞可以直接导致服务器被入侵,而且由于“日志”场景的特性,攻击数据可以多层传导,甚至可以威胁到纯内网的服...
- JVM性能监控工具
-
生产环境慎用的命令JDK中带有了一堆的工具是可以用来查看运行状况,排查问题的,但对于这些工具还是要比较清楚执行后会发生什么,否则有可能会因为执行了一个命令就导致严重故障,重点讲下影响比较大的jmap。...
- 一招教你在linux服务器配置Jenkins持续集成神器
-
01配置插件...
- 谈JVM xmx, xms等内存相关参数合理性设置
-
作者:京东零售刘乐上一篇文章说到JVM垃圾回收算法的两个优化标的:吞吐量和停顿时长,并提到这两个优化目标是有冲突的。那么有没有可能提高吞吐量而不影响停顿时长,甚至缩短停顿时长呢?答案是有可能的,提高...
- 一周热门
-
-
一文读懂关于MySQL Datetime字段允许插入0000-00-00无效日期
-
MySQL数据库关于表的一系列操作 mysql 表操作
-
IDC机房服务器托管可提供的服务
-
新版腾讯QQ更新Windows 9.9.7、Mac 6.9.25、Linux 3.2.5版本
-
一款全能的看图软件,速度快、功能强、免费用
-
Boston Dynamics Founder to Attend the 2024 T-EDGE Conference
-
每天一个入坑小技巧:MySql和oracle语法区别(今日追加)
-
Serv-u 提权
-
一文看懂mysql时间函数now()、current_timestamp() 和sysdate()
-
深度测评:Pixave 和图片管理之间的距离(二)
-
- 最近发表
- 标签列表
-
- huaweiupdateextractor (27)
- mysql 时间索引 (31)
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- oracle timestamp比较大小 (28)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- 加密与解密第四版pdf (30)
- jemeter官网 (31)
- parsevideo (33)
- 个人网站源码 (37)
- exe4j_java_home (30)
- centos7.4下载 (33)
- xlsx.full.min.js下载 (32)
- 深度学习 pdf (28)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- usb2.0-serial驱动下载 (30)
- vs2010官网 (31)
- python核心编程第四版pdf (32)
- jdk1.8.0_191下载 (33)