【Spark】Spark性能调优

ops/2024/12/14 13:08:27/

如果觉得这篇文章对您有帮助,别忘了点赞、分享或关注哦!您的一点小小支持,不仅能帮助更多人找到有价值的内容,还能鼓励我持续分享更多精彩的技术文章。感谢您的支持,让我们一起在技术的世界中不断进步!

Spark 性能调优

1. 资源配置
  • Executor 配置:合理配置--num-executors--executor-memory--executor-cores,Executor数量、内存、核数要根据工作负载进行调整,避免内存不足或过度分配。
  • Driver 配置:设置 --driver-memory 来分配给 Driver 的内存,确保 Driver 能够处理所有的任务调度。
2. 数据存储和格式
  • 存储格式:选择合适的存储格式,推荐使用列式存储格式(如 Parquet 或 ORC),它们能有效压缩数据,并且支持快速查询。
  • 分区策略:合理地选择数据的分区策略,避免数据倾斜。使用 repartitioncoalesce 对 DataFrame 或 RDD 进行分区操作,使分区更均匀。
  • 数据压缩:使用合适的压缩算法(如 Snappy、Gzip 等)来减少存储空间和网络传输开销。
3. 并行度调整
  • 任务并行度:调整任务的并行度(例如,设置 spark.sql.shuffle.partitions(调整 Shuffle read task并行度) 或 spark.default.parallelism(默认并行度)
    ),使任务能够合理分配到多个节点上,避免某些节点成为瓶颈。
4. 广播变量
  • 使用广播变量来避免大规模的数据重复传输,尤其是在需要和小表进行 join 操作时,避免小表重复发送给所有的 executor。
5. 使用Kryo序列化
  • Spark默认使用 Java 的序列化机制,Java序列化机制的效率不高,序列化速度慢并且序列化后的数据所占用的空间依然较大,Kryo序列化更高效,能减少序列化数据的体积并提高速度
6. 调整本地化等待时长
  • Spark 希望 task 能够运行在它要计算的数据算在的节点(数据本地化思想),这样就可以避免数据的网络传输,
  • Spark会等待一段时间,默认 3s,如果等待指定时间后仍然无法在指定节点运行,那么会自动降级,尝试将 task 分配到比较差的本地化级别所对应的节点上
  • 本地化等级分为:PROCESS_LOCAL(性能最好)、NODE_LOCAL、RACK_LOCA、NO_PREF、ANY
  • 设置代码如下:val conf = new SparkConf().set(“spark.locality.wait”, “6s”)
7. 算子调优
  • mapPartition算子替代map算子,如果某个分区数据量过大,容易导致 OOM,因此需谨慎使用。
  • foreachPartition算子替代foreach算子,通常用于完成数据库的写入,此算子可以减少资源初始化开销,但同样要注意分区数据量过大可能导致OOM。
  • reduceByKey算子替代groupByKey算子,reduceByKey会进行局部combine操作,可减少shuffle时传输的数据量。
  • 使用repartition算子与coalesce算子重分区,repartition 会触发 shuffle 操作,适用于增大分区数;coalesce 仅在减少分区数时适用,且不会触发 shuffle,适合在分区数差距较小的情况下使用。
  • 避免使用collect操作,collect操作会将数据拉取到driver端,数据量较大时会导致OOM。
8. shuffle调优
  • 调节map算缓冲区大小,默认为32KB,代码设置:val conf = new SparkConf().set(“spark.shuffle.file.buffer”, “64”),增加缓冲区大小,缓解频繁溢写
  • 调节reduce端拉取数据缓冲区大小,默认为48MB,代码设置:val conf = new SparkConf() .set(“spark.reducer.maxSizeInFlight”,
    “96”),增加缓冲区带下,减少拉取数据的次数,减少网络传输,提升性能。
  • 调节SortShuffleManager排序操作的阈值,默认值为200,代码设置:val conf = new SparkConf().set(“spark.shuffle.sort.bypassMergeThreshold”,
    “400”),shuffle write 过程中不会进行排序操作,减少了排序的性能开销。
9. 缓存和持久化
  • RDD 缓存:对于需要多次访问的数据,可以使用 cachepersist 将数据缓存到内存中,避免重复计算。
  • 合适的持久化级别:根据内存和计算需求,选择合适的持久化级别,如 MEMORY_ONLYMEMORY_AND_DISK,来平衡内存使用和磁盘 IO。
10. 日志和监控
  • 合理的日志级别:设置合理的日志级别(例如使用 INFOWARN),避免日志过多影响性能。
  • Spark UI 监控:通过 Spark UI 监控作业执行情况,识别性能瓶颈,如任务执行时间过长、shuffle 操作过多等。

http://www.ppmy.cn/ops/141825.html

相关文章

代码随想录训练营第十七天| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

654.最大二叉树 题目链接/文章讲解: 代码随想录 视频讲解:又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树_哔哩哔哩_bilibili 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子…

开源模型应用落地-知识巩固-生产级AI服务优化(二)

一、前言 在构建基于Flask的AI接口服务时,采用蓝图(Blueprint)架构可以大幅提升应用的可管理性和扩展性。通过将不同功能模块(如用户认证、模型处理和数据管理)组织成独立的蓝图,我们可以更加清晰地划分代码结构,使团队协作和后续维护变得更加高效。同时,借助 `python-…

TCP 为什么是 3 次握手 4 次挥手?

前言: TCP 的 3 次握手 4 次挥手是一个非常经典的问题,相信各位从事 Java 的朋友在职业生涯中没少被问到这个问题,本篇我们就展开分析一下 TCP 为什么是 3 次握手 4 次挥手。 TCP 协议 要搞清楚 TCP 为什么是 3 次握手 4 次挥手我们需要先…

CPU性能优化--基于处理器事件的采样

基于处理器事件的采样processor event based sampling PEBS 是CPU的另一种非常有用的特性,PEBS被用来在每个采样点获取更多的补充数据。在Intel处理器中,PEBS是在NetBrust微架构开始i引入的,在AMD处理器中,类似的特性叫基于指令的…

活动预告 |【Part1】Microsoft Azure 在线技术公开课:使用 Microsoft Fabric 实现数据湖仓

课程介绍 通过 Microsoft Learn 免费参加 Microsoft Azure 在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft Cloud 技术的了解。参加“使用 Microsoft Fabric 实现数据湖仓”活动,了解如何在 AI 的帮助下统一数据分析。了解如何简…

axios的引入和基本使用

一、axios的引入 使用 pnpm add axios 二、使用axios 三、axios的使用方法补充 axios除了直接使用它实例上的方法,还可以通过配置的方式进行使用axios({}),传入一个对象,这个对象可以有如下属性: url(字符串&#…

Polkadot 11 月生态月报:3900万交易量、69%增长率,技术与社区齐头并进

原文:https://x.com/Polkadot/status/1865118662069490074 编译:OneBlock 上个月对 Polkadot 生态来说可谓是跌宕起伏,从创下交易记录到开创性合作,Polkadot 热度不断。展现出强大的技术实力和蓬勃发展的社区活力。在回顾本月亮点…

3D开发工具HOOPS对B-Rep的支持:提升3D建模与可视化的精度与效率

在现代3D建模与计算机辅助设计(CAD)领域,“B-Rep(边界表示)"是一种广泛应用的几何建模技术。B-Rep通过定义三维对象的边界和拓扑结构,使得复杂的几何形状能够在计算机中准确表示并进行分析。作为前面的…