Spark在降本增效中的一些思考

背景

在大环境不好的情况下,本司也开始了“降本增效”,本文探讨一下,在这种背景下 Spark怎么做的降本增效。
Yarn 基于 EMR CPU 是xlarge,也就是内存和核的比例在7:1左右的 ,磁盘是基于 NVMe SSD
Spark 3.5.0(也是刚由3.1 升级而来 )
JDK 8
这里为什么强调 NVMe ,因为相比于 HDD 来说,他的磁盘IO有更高的读写速度。 导致我们在 Spark上 做的一些常规优化是不起效果的

注意:如没特别说明 P99 P95 avg等时间单位是秒

优化手段

调整JVM GC策略

因为我们内部存在于类似 Apache kyuubi这种 long running的服务,而且内存都是20GB起步,所以第一步就想到调整 CMS 策略为 G1 或者 Parallel.
测试结果:

GC类型p100p99p95p90p50avgtask_count
CMS95692085.3800000000047688208343.8580512068836887363
G193802164.9100000000035853378652.2275451140619788110
Parallel109192192.970000000001888393652.0600647889858788904

从结果上来看,CMS在 吞吐上比 G1和Parallel 都要好的,附上 JVM的一些关键参数如下
Spark driver端的配置都是一样:

"spark.driver.extraJavaOptions": "-verbose:gc -XX:+UseParNewGC -XX:MaxTenuringThreshold=15 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5  -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+ParallelRefProcEnabled -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump",

CMS的 Executor 配置如下:

"spark.executor.extraJavaOptions": " -verbose:gc -XX:+UseParNewGC -XX:MaxTenuringThreshold=15 -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=5  -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -XX:+ParallelRefProcEnabled -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump"

G1的 Executor 配置如下:

"spark.executor.extraJavaOptions": "-verbose:gc -XX:+UseG1GC -XX:ParallelGCThreads=10 -XX:ConcGCThreads=5 -XX:G1ReservePercent=15 -XX:MaxTenuringThreshold=15 -XX:+ParallelRefProcEnabled -XX:+ExplicitGCInvokesConcurrent -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump"

Parellel 的 Executor 配置如下:

"spark.executor.extraJavaOptions": "-Dcarbon.properties.filepath=carbon.properties -Dlog4j.configuration=xql-log4j.properties -verbose:gc -XX:++UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=10 -XX:+UseAdaptiveSizePolicy -XX:+ParallelRefProcEnabled  -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heapdump"

增发并发度

在对任务的运行时长进行统计的时候我们发现,绝大部分任务都是运行时间在5分钟左右,而与此同时在任务高峰期的时候,整体任务的等待数量一直在1800左右,这种情况下,增大任务的并发度能够很好的增加整体的吞吐,实践中,起码后20%的提速,具体的运行时间如下:

p99p95p90p50avg
239194656238193.19207605335595

引入ESS或者RSS

对于 ESS 可以参考:push-based shuffle to improve shuffle efficiency,但是这里请注意一点,该问题的提出点是基于 HDD 类型的磁盘的,因为我们现在是基于 NVMe SSD 的,所以几乎没有什么提升。
对于 RSS 可以参考:Apache celeborn,结果也是差不多。

引入向量化插件

对于向量化加速这块建议参考: Gluten,这也是笔者一直在关注的项目,根据 TPC-H 测试结果显示起码有2倍的性能提升,但是实际效果还是得看SQL的pattern。但是由于目前我们的Spark 是基于 3.5.0的,是比较新的版本,而社区这块的融合还在继续,所以这块今年应该可以行动起来,可以参考Add spark35 scala213

设置压缩格式为ZSTD

众所周知,ZSTD在压缩率和压缩解压缩上的性能都是很突出,但是在 NVMe SSD 光环下,改成了ZSTD的压缩格式以后,效果却不如人意,而且我们还合并了Parallel Compression Support for ZSTD到我们内部的Spark版本中,具体的效果如下:
具体的配置项为:“spark.io.compression.codec”:"zstd"

压缩格式p99p95p90p50avgtask_count
lz42806.510000000003412160585.62898089171975628
zstd1814.3700000000076118.349999999999878.3000000000000111117.2063492063492378

注意: 我们批集群的CPU利用率在60%以上,引入zstd以后会增加CPU的使用率,而且在这种 long running的服务下,得增加driver的core数,要不然会导致在进行广播的时候卡住,具体的可以加如下配置:

"spark.driver.cores":"8", 
"spark.io.compression.zstd.workers":"2",

至于效果为什么不理想,主要原因还是因为 shuffle数据量不大,可能对于单个shuffle数据量大的应用来说,可能效果比较明显。

增大可广播join的阈值大小

因为对于这种 long running的服务,driver端的内存一般都是挺大的,所以可以适当增大spark.sql.autoBroadcastJoinThreshold的配置,笔者这里设置了 50MB

引入动态资源分配

对于这种long running服务来说,每个时段的任务数肯定是不一样的,那这个时候引入动态资源分配的话,效果就是很好的,具体的配置可以参考如下:

"spark.shuffle.service.enabled":"false"
"spark.dynamicAllocation.enabled": "true",
"spark.dynamicAllocation.shuffleTracking.enabled": "true",
"spark.dynamicAllocation.minExecutors": "20",
"spark.dynamicAllocation.maxExecutors": "40",
"spark.dynamicAllocation.executorIdleTimeout":"3600"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/635755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于大模型学习中遇到的3

来源:网络 Embedding模型 随着大型语言模型的发展,以ChatGPT为首,涌现了诸如ChatPDF、BingGPT、NotionAI等多种多样的应用。公众大量地将目光聚焦于生成模型的进展之快,却少有关注支撑许多大型语言模型应用落地的必不可少的Embed…

中仕教育:社会人员可以报名三支一扶吗?

三支一扶是针对高校应届毕业生的一种考试,社会人员并不满足报考条件,所以不能报考。 三支一扶报考条件: 1.应届毕业生或者毕业两年内未就业的往届毕业生。 2.专科以上学历 3.遵纪守法,作风良好。 不同地区的考试要求不同&…

【AJAX框架】AJAX入门与axios的使用

文章目录 前言一、AJAX是干什么的?二、AJAX的安装2.1 CDN引入2.2 npm安装 三、基础使用3.1 CDN方式3.2 node方式 总结 前言 在现代Web开发中,异步JavaScript和XML(AJAX)已经成为不可或缺的技术之一。AJAX使得网页能够在不刷新整个…

【C++】std::string 转换成非const类型 char* 的三种方法记录

std::string 有两个方法:data() 和 c_str(),都是返回该字符串的const char类型,那如何转换成非const的char呢? 下面展示三种方法: 强转:char* char_test (char*)test.c_str();使用string的地址&#xff…

LeetCode 热题 100 | 双指针(下)

目录 42. 接雨水 1 方法一:我的方法 2 方法二:动态规划 3 方法三:双指针 菜鸟做题第一周,语言是 C 42. 接雨水 1 方法一:我的方法 Warning:这是我的智障做法,请勿模仿 我只能说它教会…

17.正则表达式

正则表达式 正则表达式1.字符类2. 逻辑运算符3. 预定义字符4. 数量词5. 数据爬取6. 按要求爬取6.1 贪婪爬取6.2 非贪婪爬取 7. 字符串中使用正则表达式的方法8. 分组括号8.1 匹配和捕获分组8.2 引用和后向引用8.3 零宽断言8.4 分组嵌套与递归8.5 忽略大小写8.6 代码示例 正则表…

用Go plan9汇编实现斐波那契数列计算

斐波那契数列是一个满足递推关系的数列,如:1 1 2 3 5 8 ... 其前两项为1,第3项开始,每一项都是其前两项之和。 用Go实现一个简单的斐波那契计算逻辑 func fib(n int) int {if n 1 || n 2 {return 1}return fib(n-1) fib(n-2) …

MySQL---视图索引

表定义: 学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:S…

Redis设置开机自启动

1.新建一个系统服务文件 首先输入命令:vi /etc/systemd/system/redis.service 进入vim后粘贴下方代码,注意查看地址是否一致。 ExecStart后面接的是你的redis-server的安装位置和redis配置文件的目录 [Unit] Descriptionredis-server Afternetwork.ta…

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server

在Pycharm上部署项目到远程服务器,有时候需要启动SSH会话,启动的时候发现没反应,且事件日志显示:无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边,发现“无默…

怎样陪孩子度过一个充实的假期?

你好,我是白丽丽。之前我作为得到图书的负责人,为你介绍过李希贵校长的《家庭教育指南》这本书的使用方法,今天我和你聊聊,怎么用这本书来迎接假期里的一个个挑战,帮助你和孩子度过一个充实的假期。 作为家长&#xf…

2024最新最全:【CISP系列考试大纲】零基础入门到精通

CISP(Certified Information Security Professional)中文全称注册信息安全专业人员认证,是经中国信息安全测评中心依据中编办批准开展“信息安全人员培训与资质认证”的职能,推出的代表国家对信息安全专业人员能力认可的证书。 C…

数据结构——排序

前言:哈喽小伙伴们好久不见,也是顺利的考完试迎来了寒假。众所周知,不怕同学是学霸,就怕学霸放寒假,假期身为弯道超车的最佳时间,我们定然是不能懒散的度过。 今天我们就一起来学习数据结构初阶的终章——…

不要让努力变成一种自虐

当我们为了工作而连续熬夜,不顾身体健康,可能只是在自虐。举个例子,长时间的工作压力和过度努力可能导致身体和心理的疲惫,反而影响到工作效率和生活质量。正确的努力包括合理的工作时间、科学的工作方式,以及关注自己…

嵌入式软件工程师面试题——2025校招社招通用(Linux篇)(二十六)

说明: 面试群,群号: 228447240面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但…

仰暮计划|“学校四周无围墙,教室通风望天窗”

一九七二年高中毕业,我成了回乡青年。玉米地里抡过锄,当阳峪村烧白干,化肥厂内装卸车,深山修渠扛石块。一九七四年十月,村革委会主任找我谈话,“回乡二年来,你无论是政治思想改造,还…

spring security oauth2login 默认配置分析

版本 spring-security:6.2.1 源码 org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2LoginConfigurer public void init(B http) throws Exception {...if (this.loginPage ! null) {// 使用自定义登录页面super.loginPage(this.loginP…

Webpack5入门到原理9:处理字体图标资源

1. 下载字体图标文件 打开阿里巴巴矢量图标库选择想要的图标添加到购物车,统一下载到本地 2. 添加字体图标资源 src/fonts/iconfont.ttfsrc/fonts/iconfont.woffsrc/fonts/iconfont.woff2src/css/iconfont.css/注意字体文件路径需要修改 src/main.js import { …

Python爬虫从入门到入狱系列合集

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

ES框架详解

ES框架详解 1、全文检索的介绍 ​ 那么对于一般的公司,初期是没有那么多数据的,所以很多公司更倾向于使用传统的数据库:mysql;比如我们要查找关键字”传智播客“,那么查询的方式大概就是:select * from table where …