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

相关推荐
2601_949499941 天前
芯瑞科技 DT-1414 光模块工程实测:完美兼容博通(安华高) HFBR-1414PTZ,VCSEL 替代方案
大数据·网络·人工智能·科技·光模块
Databend1 天前
从万亿级大模型到全线应用:Databend Cloud 助力头部 AI 企业构建全链路 Trace 数据管道
大数据·数据库·sql
Elastic 中国社区官方博客1 天前
使用 Elasticsearch open inference API 对 OpenAI chat completions 进行支持
大数据·elasticsearch·搜索引擎·全文检索·jenkins
xfan_me1 天前
全国今日油价 API-油价查询-油价查询接口
大数据·人工智能·信息可视化
大任视点1 天前
武林问道承古韵 形意寻根铸武魂 纪录片《武林问道•形意寻根》山西溯源拍摄完成
大数据·业界资讯
科里 Coralyx1 天前
评测凭什么成为模型护城河:Agent评测的跨厂机制分析
大数据·人工智能·ai
东方护航数据恢复(深圳)1 天前
RAID5单盘故障后阵列状态分析与重建风险评估_东方护航数据恢复深圳店
大数据·数据库
武汉唯众智创1 天前
师资弱、设备差、课程旧?2026 大数据实训室一体化建设解决方案
大数据·大数据实训室·大数据实验室建设方案·职校大数据实训室解决方案
知识燃料1 天前
企业级生成式 AI 云平台推荐,哪些平台更适合从 Agent 原型走向生产?
大数据·人工智能