spark的shuffle原理及调优

1、shuffle原理:

当使⽤reduceByKey、groupByKey、sortByKey、countByKey、join、cogroup等操作的时候,会发⽣shuffle操作。

spark的shuffle实现:在DAG阶段以shuffle为界,划分stage,上游stage 做map task,每个map task将计算结果数据分成多份,每⼀份对应到下游stage的每个partition中,并将其临时写到磁盘,该过程就叫做shuffle write;下游stage叫做reduce task,每个reduce task通过⽹络拉取指定分区结果数据,该过程叫做shuffle read, 最后完成reduce的业务逻辑

2、shuffle的优化:

1)提前过滤数据 :在 join、groupBy 等宽依赖操作之前,尽早使用 filter 减少数据量

2)合理使用广播变量 :当一个大表和一个小表进行 join 时,将小表(通常在几百 MB 以内)用 broadcast 广播到每个 Executor,可以将 SortMergeJoin 降级为 BroadcastHashJoin,彻底避免 Shuffle。

3)提前进行聚合:在 join 之前,先对数据进行聚合缩减数据量。

4)调整 Shuffle 分区数,让每个分区的数据量控制在 200MB 到 1GB 左右,并且让分区数尽量与 CPU 核心数匹配,以提高并行度。

5)动态调整 Shuffle 和执行计划

动态合并 Shuffle 分区:自动将 Shuffle 产生的小文件合并成合适的尺寸。

动态调整 Join 策略:如果运行时发现表的大小适合广播,会自动将 SortMergeJoin 转换为 BroadcastHashJoin

复制代码
spark.sql.adaptive.enabled=true
spark.sql.adaptive.coalescePartitions.enabled=true
spark.sql.adaptive.coalescePartitions.parallelismFirst=false -- 优先保证分区大小合适,而不是优先保证并行度
spark.sql.adaptive.advisoryPartitionSizeInBytes=128MB -- 期望的单个分区数据量

6)减少 Shuffle 数据溢出,调整 Shuffle 写数据落盘的缓冲区大小

  • spark.shuffle.file.buffer:Map 端 Shuffle 写数据时的缓冲区,默认 32KB。增大该值(例如 64KB 或 128KB)可以减少磁盘 I/O 次数。

  • spark.file.transferTo:默认为 true,使用零拷贝(NIO)传输数据。如果遇到兼容性问题或 NIO 表现不佳,可以设为 false 回退到传统 I/O

相关推荐
随身数智备忘录2 分钟前
拆解安全生产法三大核心功能,安全生产法如何解决责任不清与事故追责难
大数据·人工智能·安全
少司府3 分钟前
Tools相关:深入浅出学Git
大数据·c++·git·gitee·github·仓库·分支
旺仔Sec7 分钟前
HBase 分布式集群部署实战:从解压到启动的完整指南
数据库·分布式·hbase
多年小白10 分钟前
今日A股 拉
大数据·人工智能·深度学习·microsoft·ai
2401_8685347812 分钟前
论快速应用开发方法及应用
大数据·python
humors22118 分钟前
听劝和辨劝
大数据·程序人生
cy_cy00221 分钟前
地砖感应屏在数字展厅的应用实践
大数据·科技·人机交互·交互·软件构建
扫地的小何尚23 分钟前
掌握 Agentic AI 技术:AI Agent 定制方法全景与实践路径
大数据·人工智能·算法·ai·llm·agent·nvidia
互联圈运营观察23 分钟前
泛微发布300+可落地AI应用 让组织业务数智升级
大数据·人工智能
阿星AI工作室9 小时前
刘润年中大课笔记:一句话说清AI落地之战的本质
大数据·人工智能·创业创新·商业