SparkSQL优化策略大盘点

简介: SparkSQL优化策略大盘点

前言

大部分做Spark开发的同学或多或少都做过很多的优化,事实上优化的策略是很多的,还有很多的默认策略做了其实是无感知,当时当某些场景数据规模比较庞大的时候就需要用户自己去控制优化策略了,我们希望对优化策略有个整体认识,然后我们做优化的时候才能够从多方面去切入。

优化策略的分类

针对各个场景优化做一个分类比较,然后对比较常用的参数进行举例说明

类型 优化位置 场景说明 优点 局限性 场景举例
Core Spark-Core Spark底层的执行策略,调度分配策略,shuffle等策略 影响覆盖面广,可编程性强,自然也比较灵活 需要比较底层的API控制,上手比较难 Shuffle算法策略选择,task调度分配,超时控制等
RBO 逻辑计划 主要是SQL的逻辑计划进行优化,基于经验规则的优化 优化策略比较明确,易于扩展规则策略,覆盖大部分的场景,本身成熟度高 作用度有所局限,不会根据数据特征进行优化,策略比较固化 常量折叠、谓词下推、操作合并、列裁剪、列裁剪下推,算子简化,条件简化等
CBO 主要是针对物理计划进行优化 基于统计信息对执行计划进行调整 本身会考虑计算成本、可以根据数据分布进行优化、对数据敏感,自动性较强 CBO本身基于统计信息进行优化,对数据采集影响大,数据不准确带来优化策略效果不好、收集统计信息本身带来计算成本 Join顺序调整、Build侧选择、优化 Join 类型、优化多表 Join 顺序
AQE 任务执行过程调整执行计划 执行过程中动态拉取执行数据调整执行计划 自动化强度高,自适应性强 比较新的策略,考虑的维度不是很高,目前覆盖场景不是很广 动态折叠shuffle过程中的partition、动态选择join策略、动态优化存在数据斜的join

其他方面的优化和优化思路

shuffle的优化

shuffle实际上是需要经过重新进行文件的读写达到重新划分分区的目的,这期间带来比较大的IO操作,还一方面的原因是一般的大平台的nodemanager节点同时也会是DataNode的节点,两个操作都需要比较大量的RPC操作和IO的操作,在同时读写操作比较大的时候,会导致shuffle的失败,比较常见的思路就是减少同时操作的压力,剥离计算和存储节点,还有种做法是shuffle通过外部的服务,本质上都是解决这个shuffle带来的IO问题

计算的复用

计算的复用是通过执行策略进行操作的,Spark比较大的操作其实就是shuffle本身,spark对表的bucket存储可以把表的分桶信息进行物化,使用表的时候使用相同的bucket shuffle操作的时候可以复用这一次shuffle操作,不再需要进行shuffle的动作了,这块可以加速join 、group by、 over()这些操作是生产实践比较多的操作

使用列式存储

parquet和orc这类的存储格式实现了按列进行读写,大部分的情况下,我们其实不会需要把全部字段给查出来,按列式存储可以减少每次读取的数据量,另一方面列式存储在减少读取方面还做了一些文件下推操作的优化,可以按照文件读取的范围进行筛选。

合理使用数据类型

这个其实是比较常见的问题,但是实际应用时候问题比较多,很多场景数字类型使用了字符串保存,shuffle操作在数据量比较大的时候其实是需要进行排序,排序伴随的动作就是比较两个数据的大小,数子类型和字符串类型的大小比较复杂度其实是很不一样的,还一个就是数字类型比较大小时候结果其实和字符串结果并不一样,但是这个很多时候被忽略,另一方面数字类型可以明确划定范围,这个在列式存储优化时候也是作用很大。一方面为了结果准确需要精准给定数据类型,还以方面可以加速。

减少落地操作

在hive时代大部分是用一个临时表进行中间结果的存储,本身问题不大。但是到了spark时代,尤其是内存计算的时候频繁的落地显得会比较耗时,可以通过使用中间的临时视图进行中转结果,当然这种场景限于不是计算量很大的中间结果。

create temporary view view_xxx as select xxx from 

merge on read

少量更新引发大量的IO,这个问题其实是当前平台的一个很大问题,这个当前delta lake的解决方案有了一些支持,但是传统sql通过bucket和view方案的操作可以带来很大的优化,具体解决的场景就是,我们需要合并一个历史数据和新增的数据时候,历史数据是一份大的base表数据,增量是比较少的数据量更新那么提前把历史数据bucket化,新增的数据做一次小bucket进行join,这种join其实可以维护成视图,我们在真正进行操作的时候调用这个视图,这样可以在shuffle和read的时候同时得到优化

总结

spark的优化可以从spark运行优化、sql执行策略、数据存储策略等方面同时进行优化,关键点不同策略其实着力点是不一样的,需要了解这个策略是在哪一个层次进行的优化才行!

目录
相关文章
|
7月前
|
安全 物联网 API
Windows 11 25H2 | 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 12 月更新)
Windows 11, version 25H2 Enterprise Arm64 x64 (updated Dec 2025)
589 0
Windows 11 25H2 | 24H2 中文版、英文版 (x64、ARM64) 下载 (2025 年 12 月更新)
|
SQL 分布式计算 大数据
利用SparkSQL Logical Plan Parse 打造大数据平台SQL诊断利器
利用SparkSQL Logical Plan Parse 打造大数据平台SQL诊断利器
561 0
|
缓存 分布式计算 资源调度
Spark 与 MapReduce 的 Shuffle 的区别?
MapReduce 和 Spark 在 Shuffle 过程中有显著区别。MapReduce 采用两阶段模型,中间数据写入磁盘,I/O 开销大;而 Spark 使用基于内存的多阶段执行模型,支持操作合并和内存缓存,减少 I/O。Spark 的 RDD 转换优化减少了 Shuffle 次数,提升了性能。此外,Spark 通过 lineage 实现容错,资源管理更灵活,整体大数据处理效率更高。
|
SQL 分布式计算 Java
Spark 为什么比 Hive 快
Spark与Hive在数据处理上有显著区别。Spark以其内存计算和线程级并行提供更快的速度,但稳定性受内存限制。相比之下,Hive虽较慢,因使用MapReduce,其稳定性更高,对内存需求较小。在Shuffle方式上,Spark的内存 Shuffle 比Hive的磁盘 Shuffle 更高效。综上,Spark在处理速度和Shuffle上占优,Hive则在稳定性和资源管理上更胜一筹。
1662 0
|
人工智能 IDE 开发工具
给IntelliJ IDEA添加AI功能
这篇文章讲解了如何在IntelliJ IDEA中安装和使用阿里云开发的通义灵码插件,以增强IDE的人工智能辅助编程功能。
11324 0
给IntelliJ IDEA添加AI功能
|
机器学习/深度学习 人工智能 自然语言处理
机器学习系列1 机器学习历史
 人工智能(AI)作为计算机领域与机器学习的历史交叉点,随着支撑机器学习的算法和算力的增长,AI的发展也得到进步。值得关注的是,虽然这些研究从1950年代已经开始出现,但重要的算法:统计,数学,计算等相关技术理论的发现远早于这个时代。事实上,人们已经思考这些问题数百年 。本文将讨论“思考机器”概念的历史知识基础。
672 0
|
SQL 存储 缓存
Apache Doris 2.1.6 版本正式发布
2.1.6 版本在 Lakehouse、异步物化视图、半结构化数据管理持续升级改进,同时在查询优化器、执行引擎、存储管理、数据导入与导出以及权限管理等方面完成了若干修复
525 6
|
大数据 数据挖掘 Java
大数据平台开发规范示例
大数据平台开发规范示例
665 0
大数据平台开发规范示例
|
存储 缓存 NoSQL
缓存、分布式缓存和持久化
这篇内容介绍了缓存的概念和Redis的作用,以口袋与公文包的比喻解释了缓存如何提高数据访问速度。Redis是一个内存中的高级缓存系统,能提升系统响应速度。接着讨论了为何需要分布式缓存,通过多个“篮子”(Redis节点)解决单点故障和性能瓶颈,保证高可用性和数据安全性。最后提到了Redis的两种持久化机制——RDB(定期数据快照)和AOF(记录写操作日志),分别用照片备份和实时同步来比喻,说明它们在数据丢失风险和恢复速度上的权衡。

热门文章

最新文章