怎样在Spark SQL中避免GROUP BY引起的Shuffle数据移动

陌宇吖_9486

陌宇吖_9486

2026-11-02

757人浏览

原创

GROUP BY 一定触发 Shuffle,因其需将相同 key 的数据拉至同一 executor 完成聚合;Spark SQL 的 groupBy.agg 默认启用 map-side 预聚合,而 groupByKey 无预聚合易 OOM;应前置过滤、投影、哈希截断,并对倾斜 key 加盐或两阶段聚合。

怎样在spark sql中避免group by引起的shuffle数据移动

GROUP BY 为什么一定触发 Shuffle

Spark SQL 中的 GROUP BY 是逻辑聚合操作,底层必须把相同 key 的所有记录拉到同一个 executor 上才能完成聚合。这意味着无论数据原本在哪个 partition,只要 key 相同,就必须跨 partition 移动——这就是 Shuffle 的本质。不存在“不 shuffle 的 GROUP BY”,只有“shuffle 少不多”的差别。

用 reduceByKey / aggregateByKey 替代 groupByKey(在 DataFrame 层对应为 agg + groupBy)

很多人误以为 groupBy(...).agg(...) 和 groupByKey 是一回事,其实 Spark SQL 的 groupBy 默认已启用 map-side 预聚合(类似 reduceByKey),只要聚合函数支持部分合并(如 sum、count、avg),就会先在每个 partition 内局部计算,再 shuffle 合并结果。但如果你写的是 groupByKey().map(...) 这种 RDD 风格代码,就完全绕过了预聚合,会把所有原始数据全量 shuffle。

  • ✅ 正确: df.groupBy("user_id").agg(sum("amount"), count("*")) —— 自动预聚合,shuffle 数据量小
  • ❌ 危险: rdd.groupByKey().mapValues(it => it.sum) —— 全量 value shuffle,易 OOM
  • ⚠️ 注意:自定义 UDAF 若未实现 merge 方法,则无法预聚合,等效于 groupByKey

提前过滤和投影,减少 shuffle 数据体积

Shuffle 的开销和传输字节数强相关。哪怕逻辑上必须 GROUP BY,也能通过前置裁剪显著降压:

  • 在 GROUP BY 前加 filter,比如 WHERE dt = '2026-10-01',避免把历史冷数据也拉进来 shuffle
  • 用 select 只保留分组键和聚合字段,去掉无关列(如长文本、JSON 字段),否则这些字段也会被序列化传输
  • 对字符串 key 做哈希截断(如 substr(md5(user_id), 1, 8))可减小网络传输量,但需确认业务是否允许 key 模糊

遇到数据倾斜时,别硬扛 GROUP BY

当某个 key 占比超 10%,GROUP BY 的 shuffle 就会卡在一个 task 上。此时强行优化 shuffle 参数意义不大,应改写逻辑:

  • NULL key 单独处理:UNION ALL 把 IS NULL 和非空分支拆开聚合
  • 热点 key 加盐:用 CASE WHEN user_id = 'hot_user' THEN concat('salt_', floor(rand(123) * 20), '_', user_id) ELSE user_id END,注意必须固定 seed
  • 两阶段聚合:第一阶段加盐分组汇总,第二阶段去盐合并,确保二次聚合只处理少量中间结果

真正难的不是写出不 shuffle 的语句,而是判断“这个 GROUP BY 是否真的不可替代”——有时候换掉它(比如改用窗口函数或预计算表)比调优更有效。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

5876

5

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

2025.12.08

1269

12

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

243

5

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

526

22

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4749

19

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

2026.11.02

0

14

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

2026.11.02

0

17

Uvicorn安装配置教程
Uvicorn安装配置教程

本专题汇总了Uvicorn的安装配置教程与部署指南,涵盖通过pip安装Uvicorn、启动FastAPI/Starlette应用、开发模式热重载(--reload)及多进程工作模式配置等核心操作。同时整理了结合Gunicorn的生产部署方案、HTTPS与反向代理配置及性能调优技巧,助你快速完成Uvicorn服务的安装与上线部署。

2026.11.02

0

17

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

100

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习