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

相关推荐
小羊没烦恼!1 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
一隅论数智1 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
尧炎科技1 天前
防潮抗变形,就选纯品梅花全桉多层板
大数据
程序员大阳1 天前
副队长大数据教程(5)--集群情况下虚拟机网络配置
大数据·集群·nat·网路
自由能燃气设备1 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远1 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
嘉立创FPC苗工1 天前
FPC与机器人的双向赋能,解锁智能装备进化新势能
大数据·人工智能·制造·fpc·电路板
AI职业加油站1 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
龙亘川1 天前
一网统管AI平台民生业务实践:基于城市数字底座赋能公积金业务服务升级
大数据·安全·智慧城市·开源软件·数据可视化·政务
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构