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

相关推荐
一条大祥脚7 分钟前
【CS336】lecture7 多卡|通信架构|集合通信|NCCL|通信原语|torch.distributed
分布式·架构·nccl·多机多卡·集合通信
Sayai17 分钟前
DataX 离线数据同步实战:Elasticsearch 数据批量导出 MySQL(作业配置、并发调优与定时同步平台化设计)
大数据·mysql·elasticsearch·datax·数据同步
171320330计算机毕设编程1 小时前
计算机毕业设计 基于YOLO改进算法的车辆特征识别系统设计与实现--lw
java·大数据·python·sql·算法
星创易联1 小时前
PLC数据采集与远程运维平台:从边缘计算到集中监控
大数据·运维·边缘计算
亲笔签1 小时前
“场景重庆”典型案例 | 数字笔迹技术赋能政务服务 打造可信电子签署创新场景
大数据·人工智能
198******126341 小时前
2026 企业 AI 办公工具选型指南:搭建适配业务的智能工作体系
大数据·人工智能·数据挖掘
Elastic 中国社区官方博客2 小时前
Kibana:创建包含时间序列图表的仪表板
大数据·elasticsearch·搜索引擎·信息可视化·全文检索·kibana
大大大大晴天2 小时前
每天认识一个组件:Apache Paimon
大数据
程序员梅雨2 小时前
ZooKeeper面经总结
java·大数据·linux·分布式·后端·zookeeper·中间件
星云低代码开发平台3 小时前
付款单、发票和银行回单联查:字段口径与异常分支
大数据