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 小时前
Spark 3.5.1 全栈实战指南:从环境部署到生产优化
大数据·分布式·spark
焦糖玛奇朵婷3 小时前
实测扭蛋机小程序:开发简单,互动有趣
java·大数据·程序人生·小程序·软件需求
姚不倒3 小时前
三节点 TiDB 集群部署与负载均衡搭建实战
运维·数据库·分布式·负载均衡·tidb
瓦中空花3 小时前
大数据工具-Flink
大数据·flink
Lab_AI3 小时前
iLabPower LES与SDH科学数据基因组平台赋能光电材料研发与生产,鼎材科技与创腾科技进一步深化合作
大数据·人工智能·oled·材料设计·光电材料研发·材料创新·材料研发
渣渣盟3 小时前
Flink实现TopN URL访问量统计
大数据·flink·scala
无你想你3 小时前
Datawhale之春晚机器人跳舞复刻
大数据·elasticsearch·机器人
前端技术3 小时前
【鸿蒙实战】从零打造智能物联网家居控制系统:HarmonyOS Next分布式能力的完美诠释
java·前端·人工智能·分布式·物联网·前端框架·harmonyos
aini_lovee3 小时前
33节点配电网分布式发电(DG)最优分布MATLAB实现
分布式·matlab·wpf