【大数据】HADOOP-YARN容量调度器Spark作业实战
目录
- 需求
- 配置多队列的容量调度器
- 验证队列资源
 
 
需求
default 队列占总内存的40%,最大资源容量占总资源的60%
 ops 队列占总内存的60%,最大资源容量占总资源的80%
配置多队列的容量调度器
- 在yarn-site.xml里面配置使用容量调度器
<!-- 使用容量调度器 -->
<property><name>yarn.resourcemanager.scheduler.class</name>   <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>
- 在capacity-scheduler.xml中配置如下:
 从Apache hadoop 3.1.0开始 CapacityScheduler支持配置绝对值格式的资源量。上面的 yarn.scheduler.capacity..capacity 和 yarn.scheduler.capacity..max-capacity 配置项,可以指定一个绝对资源量如 [memory=10240,vcores=12]。这表示为队列配置10GB的内存和12个Vcore。使用绝对值资源配置时,这2个参数分别对应Yarn web页面中队列信息的__Configured Capacity__和__Configured Max Capacity__
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 表示集群最大app数 --><property><name>yarn.scheduler.capacity.maximum-applications</name><value>10000</value></property><!-- 表示集群上某队列可使用的资源比例 目的是为了限制过多的am数,即app数 --><property><name>yarn.scheduler.capacity.maximum-am-resource-percent</name><value>0.1</value></property><!-- 配置指定调度器使用的资源计算器 --><!-- DefaultResourseCalculator 默认值,只使用内存进行比较 --><!-- DominantResourceCalculator 多维度资源计算,内存、cpu --><property><name>yarn.scheduler.capacity.resource-calculator</name><value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value></property><!-- root队列中有哪些子队列--><property><name>yarn.scheduler.capacity.root.queues</name><value>default,ops</value></property><!-- *******************default队列*********************** --><!-- default 队列占用的资源容量百分比 40% --><property><name>yarn.scheduler.capacity.root.default.capacity</name><value>40</value></property><!-- default 队列占用的最大资源容量百分比 60%--><property><name>yarn.scheduler.capacity.root.default.maximum-capacity</name><value>60</value></property><!-- 允许单个用户最多可获取的队列资源的倍数,默认值1,确保单个用户无论集群有多空闲,永远不会占用超过队列配置的资源当值大于1时,用户可使用的资源将超过队列配置的资源,但应该不能超过队列配置的最大资源--><property><name>yarn.scheduler.capacity.root.default.user-limit-factor</name><value>1</value></property><!-- 队列状态 --><property><name>yarn.scheduler.capacity.root.default.state</name><value>RUNNING</value></property><!-- 限定哪些admin用户可向root队列中提交应用程序 --><property><name>yarn.scheduler.capacity.root.default.acl_submit_applications</name><value>*</value></property><!-- 为root队列指定一个管理员,该管理员可控制该队列的所有应用程序,比如杀死任意一个应用程序等 --><property><name>yarn.scheduler.capacity.root.default.acl_administer_queue</name><value>*</value></property><!-- 配置哪些用户有权配置提交任务优先级 --><property><name>yarn.scheduler.capacity.root.default.acl_application_max_priority</name><value>*</value></property><!-- 任务的超时时间设置:yarn application -appId ${appId} -updateLifeTime Timeout --><!-- 如果application指定了超时时间,则提交到该队列的application能够制定的最大超时时间不能超过该值。--><property><name>yarn.scheduler.capacity.root.default.maximum-application-lifetime</name><value>-1</value></property><!-- 如果application没有指定超时时间,则用default-application-lifetime 作为默认值 --><property><name>yarn.scheduler.capacity.root.default.default-application-lifetime</name><value>-1</value></property><!-- *******************hive队列*********************** --><!-- hive 队列占用的资源容量百分比 60% --><property><name>yarn.scheduler.capacity.root.ops.capacity</name><value>60</value></property><!-- default 队列占用的最大资源容量百分比 80%--><property><name>yarn.scheduler.capacity.root.ops.maximum-capacity</name><value>80</value></property><!-- 允许单个用户最多可获取的队列资源的倍数,默认值1,确保单个用户无论集群有多空闲,永远不会占用超过队列配置的资源当值大于1时,用户可使用的资源将超过队列配置的资源,但应该不能超过队列配置的最大资源--><property><name>yarn.scheduler.capacity.root.ops.user-limit-factor</name><value>1</value></property><!-- 队列状态 --><property><name>yarn.scheduler.capacity.root.ops.state</name><value>RUNNING</value></property><!-- 限定哪些admin用户可向root队列中提交应用程序 --><property><name>yarn.scheduler.capacity.root.ops.acl_submit_applications</name><value>*</value></property><!-- 为root队列指定一个管理员,该管理员可控制该队列的所有应用程序,比如杀死任意一个应用程序等 --><property><name>yarn.scheduler.capacity.root.ops.acl_administer_queue</name><value>*</value></property><!-- 配置哪些用户有权配置提交任务优先级 --><property><name>yarn.scheduler.capacity.root.ops.acl_application_max_priority</name><value>*</value></property><!-- 任务的超时时间设置:yarn application -appId ${appId} -updateLifeTime Timeout --><!-- 如果application指定了超时时间,则提交到该队列的application能够制定的最大超时时间不能超过该值。--><property><name>yarn.scheduler.capacity.root.ops.maximum-application-lifetime</name><value>-1</value></property><!-- 如果application没有指定超时时间,则用default-application-lifetime 作为默认值 --><property><name>yarn.scheduler.capacity.root.opsdefault-application-lifetime</name><value>-1</value></property><!--CapacityScheduler尝试调度机本地容器之后错过的调度机会数。通常,应该将其设置为集群中的节点数。默认情况下在一个架构中设置大约40个节点。应为正整数值。--><property><name>yarn.scheduler.capacity.node-locality-delay</name><value>40</value></property><!--在节点本地延迟时间之外的另外的错过的调度机会的次数,在此之后,CapacityScheduler尝试调度非切换容器而不是机架本地容器.例如:在node-locality-delay = 40和rack-locality-delay = 20的情况下,调度器将在40次错过机会之后尝试机架本地分配,在40 + 20 = 60之后错过机会.使用-1作为默认值,禁用此功能.在这种情况下,根据资源请求中指定的容器和唯一位置的数量以及集群的大小,计算分配关闭交换容器的错失机会的数量--><property><name>yarn.scheduler.capacity.rack-locality-additional-delay</name><value>-1</value></property><!-- 此配置指定用户或组到特定队列的映射 --><property><name>yarn.scheduler.capacity.queue-mappings</name><value>u:root:default,g:root:default,u:%user:%user</value></property><property><name>yarn.scheduler.capacity.queue-mappings-override.enable</name><value>false</value></property><property><name>yarn.scheduler.capacity.per-node-heartbeat.maximum-offswitch-assignments</name><value>1</value></property><property><name>yarn.scheduler.capacity.application.fail-fast</name><value>false</value></property><property><name>yarn.scheduler.capacity.workflow-priority-mappings</name><value></value></property><property><name>yarn.scheduler.capacity.workflow-priority-mappings-override.enable</name><value>false</value></property>
</configuration>
其中的容量也可以采用绝对值来配置
<property><name>yarn.scheduler.capacity.root.default.capacity</name><value>[memory=9830,vcores=9]</value></property><property><name>yarn.scheduler.capacity.root.default.maximum-capacity</name><value>[memory=14745,vcores=14]</value></property><property><name>yarn.scheduler.capacity.root.ops.capacity</name><value>[memory=14745,vcores=14]</value></property><property><name>yarn.scheduler.capacity.root.ops.maximum-capacity</name><value>[memory=19660,vcores=19]</value></property>
不同的队列同时可以使用不同的资源配置格式,也就是说有些队列可以使用百分比格式,有些可以使用绝对值格式,而且实际使用时发现在这种混合配置中,各层级上所有队列的百分比之和必须等于100的约束将不再有效。
- 同步到其他节点后,刷新配置
bin/yarn rmadmin -refreshQueues
- 查看界面展示
  
验证队列资源
- 提交任务,查看队列资源占比情况
 提交任务
bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 2g --executor-memory 2g --executor-cores 1 --num-executors 1 --queue default examples/jars/spark-examples_2.12-3.2.1.jar 100
–driver-memory 2g --executor-memory 2g --executor-cores 1 --num-executors 1
 
 
 可以看到 向YARN的资源需求是:
 amMemory = 2048
 amMemoryOverhead = 384
executorMemory = 2048
 executorOffHeapMemory. = 0
 executorMemoryOverhead = 384
amCores = 1
最终向YARN上申请AM的资源大小为:
am = amMemory + amMemoryOverhead = 2432
 executor = executorMemory + executorMemoryOverhead = 2432
capability = <memory:2432,vCores:1>
 由于配置的集群资源分配最小单位为1024MB, 因此需要向上取整, 即 3072 MB
这也是为甚么我明明申请的 资源 比较小,但是在yarn上显示的资源总不对,比实际申请的资源要高一些。资源比预期的要高。
这主要是yarn的资源计算是用DominantResourceCalculator来计算管理 cpu、内存的。
spark和yarn上申请的资源没有对的上。
所以最终的资源:
 Driver 申请的资源 --driver-memory 2g 实际在yarn中AM申请的资源为 3g1c
 Executor 申请的资源 --executor-memory 2g --executor-cores 1 --num-executors 1 实际在yarn中executor申请的资源为 3g1c
最终总的资源为 6g2c

同理再提交一下 1g1c的
bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 1g --executor-memory 1g --executor-cores 1 --num-executors 2 --queue default examples/jars/spark-examples_2.12-3.2.1.jar 100
–driver-memory 1g --executor-memory 1g --executor-cores 1 --num-executors 2

 所以最终的资源:
Driver 申请的资源 --driver-memory 1g 实际在yarn中AM申请的资源为 1g1c
 Executor 申请的资源 --executor-memory 1g --executor-cores 1 --num-executors 2 实际在yarn中executor申请的资源为 4g2c
最终总的资源为 6g3c
- 验证队列的最大资源限制
bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 2g --executor-memory 2g --executor-cores 2 --num-executors 5 --queue default examples/jars/spark-examples_2.12-3.2.1.jar 100

 当内存需求超过队列最大资源时
bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode cluster --driver-memory 2g --executor-memory 2g --executor-cores 2 --num-executors 6 --queue default examples/jars/spark-examples_2.12-3.2.1.jar 100


 最终看到申请的资源可以超过队列配置的资源,但是不会超过最大的资源
spark申请的容器为 6 个,但是最终只启动了4个。
希望对正在查看文章的您有所帮助,记得关注、评论、收藏,谢谢您
相关文章:
 
【大数据】HADOOP-YARN容量调度器Spark作业实战
目录需求配置多队列的容量调度器验证队列资源需求 default 队列占总内存的40%,最大资源容量占总资源的60% ops 队列占总内存的60%,最大资源容量占总资源的80% 配置多队列的容量调度器 在yarn-site.xml里面配置使用容量调度器 <!-- 使用容量调度器…...
平面及其方程
一、曲面和交线的定义 空间解析几何中,任何曲面或曲线都看作点的几何轨迹。在这样的意义下,如果曲面SSS与三元方程: F(x,y,z)0(1)F(x,y,z)0\tag{1} F(x,y,z)0(1) 有下述关系: 曲面 SSS 上任一点的坐标都满足方程(1)(1)(1)不在曲…...
7 配置的封装
概述 IPC设备通常有三种配置信息:一是默认配置,存储了设备所有配置项的默认值,默认配置是只读的,不能修改;二是用户配置,存储了用户修改过的所有配置项;三是私有配置,存储了程序内部使用的一些配置项,比如:固件升级的URL、固件升级标志位等。恢复出厂设置的操作,实际…...
03_Docker 入门
03_Docker 入门 文章目录03_Docker 入门3.1 确保 Docker 已经就绪3.2 运行我们的第一个容器3.3 使用第一个容器3.4 容器命名3.5 重新启动已经停止的容器3.6 附着到容器上3.7 创建守护式容器3.8 容器内部都在干些什么3.9 Docker 日志驱动3.10 查看容器内的进程3.11 Docker 统计信…...
Python 为什么要 if __name__ == “__main__“:
各位读者,你们知道以下两个Python文件有什么区别吗? main1.py def main():output Helloprint(output)if __name__ "__main__":main()main2.py output Hello print(output)当我们直接运行 main1.py 与 main2.py 的时候,程序都…...
 
455. 分发饼干、376. 摆动序列、53. 最大子数组和
455.分发饼干 题目描述: 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块…...
 
基于Springbot+微信小程序的购药平台的设计与实现
基于Springbot微信小程序的购药平台的设计与实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、…...
 
aws lambda rust的sdk和自定义运行时
rust的aws sdk 参考资料 https://docs.aws.amazon.com/sdk-for-rust/latest/dg/getting-started.htmlhttps://awslabs.github.io/aws-sdk-rust/https://github.com/awslabs/aws-sdk-rusthttps://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rust_dev_preview rus sd…...
 
[安装之3] 笔记本加装固态和内存条教程(超详细)
由于笔记本是几年前买的了,当时是4000,现在用起来感到卡顿,启动、运行速度特别慢,就决定换个固态硬盘,加个内存条,再给笔记本续命几年。先说一下加固态硬盘SSD的好处:1.启动快 2.读取延迟小 3.写…...
 
极客时间左耳听风-高效学习
左耳听风——高效学习篇 P95 | 高效学习:端正学习态度 本人真实⬇️⬇️⬇️⬇️ “ 大部分人都认为自己爱学习,但是: 他们都是只有意识没有行动,他们是动力不足的人。 他们都不知道自己该学什么,他们缺乏方向和目标。…...
 
MSR寄存器访问
1.介绍 MSR是CPU的一组64位寄存器,每个MSR都有它的地址值(如下图所示),可以分别通过RDMSR 和WRMSR 两条指令进行读和写的操作。 如图中为8个P-state寄存器,地址分别为0xC001 0064 ~ 0xC001 006B,每个寄存…...
 
ArcGIS:模型构建器实现批量按掩膜提取影像
用研究区域的矢量数据来裁剪栅格数据集时,一般我们使用ArcGIS中的【按掩膜提取工具】。如果需要裁剪的栅格数据太多,处理起来非常的麻烦,虽然ArcGIS中有批处理的功能,但是还是需要手动选择输入输出数据。 如下图,鼠标…...
算法刷题打卡第94天: 找出给定方程的正整数解
找出给定方程的正整数解 难度:中等 给你一个函数 f(x, y) 和一个目标结果 z,函数公式未知,请你计算方程 f(x,y) z 所有可能的正整数 数对 x 和 y。满足条件的结果数对可以按任意顺序返回。 尽管函数的具体式子未知,但它是单调…...
 
浅析SAS协议(1):基本介绍
文章目录概述SAS协议发展历程SAS技术特性SAS设备拓扑SAS phySAS地址SAS设备类型SAS协议分层参考链接概述 SAS,全称Serial Attached SCSI,即串行连结SCSI,是一种采用了串行总线的高速互连技术。通过物理上使用串行总线连结,在链路…...
 
93.【Vue-细刷-02】
Vue-02(十六)、基本列表渲染 (v-for)1.使用v-for遍历数组2.使用v-for遍历对象3.使用v-for遍历字符串(十七)、列表过滤 (filter())1.⭐JS中Change属性的原生状态⭐2.使用watch监听实现3.const {xxx} this 在Vue的作用⭐⭐4.JS箭头函数参数的简写⭐5.使用computed进行计算实现(最…...
 
Allegro负片层不显示反盘的原因和解决办法
Allegro负片层不显示反盘的原因和解决办法 在用Allegro做PCB设计的时候,负片设计是较为常用的一种方式,有时会出现打开负片层却看不到反盘的情况,如下图 L2层是负片层 L2层仍然只能看到盘 如何才能看到反盘显示的效果,具体操作如下 首先确定L2层层叠里面设置的是负片...
ACM数论 裴蜀定理(贝祖定理)
一.内容定义 「裴蜀定理」,又称贝祖定理(Bzouts lemma)。是一个关于最大公约数的定理。其内容定义为:对于不全为零的任意整数 a 和 b,记二者的最大公约数为 g 即 gcd(a,b) g,则对于任意整数 x 和 y 都一定…...
基础篇—CSS Position(定位)解析
CSS Position(定位) position 属性指定了元素的定位类型。 position 属性的五个值: relativefixedabsolutesticky元素可以使用的顶部,底部,左侧和右侧属性定位。然而,这些属性无法工作,除非是先设定position属性。他们也有不同的工作方式,这取决于定位方法。 1、static…...
正则表达式与grep
基本正则表达式BRE集合 匹配字符匹配次数位置锚定 符号作用^尖角号,用于模式的最正常,如“^haha”,匹配以haha单词开头的行$美元符,用于模式的最右侧,如“haha$”,表示haha单词结尾的行^$组合符ÿ…...
 
开发必备的IDEA 插件!效率提升 50 倍!
日常开发中,面向百度编程的程序员,很多时候,你跟大佬级别的差距,可能不仅仅是知识面的差距,还有就是开发效率的差距。以下是我常用的几个IDEA插件,废话不多说,直接肝干货! 1. Codot…...
 
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
 
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
 
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
 
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
 
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
 
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
JS红宝书笔记 - 3.3 变量
要定义变量,可以使用var操作符,后跟变量名 ES实现变量初始化,因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符,可以创建一个全局变量 如果需要定义…...
