Spark SQL 与 Shuffle 优化
Spark SQL 性能优化的核心是理解 Catalyst、Join 策略、Shuffle、数据倾斜和分区设计。
Spark SQL 与 Shuffle 优化
Spark SQL 让大数据计算变得像写 SQL 一样简单,但 SQL 简单不代表执行简单。一个 Join 或 Group By 可能触发巨大的 Shuffle。
理解 Spark SQL 性能,关键是理解优化器和 Shuffle。
Rendering diagram...
Catalyst Optimizer
Catalyst 是 Spark SQL 的优化器。它会做谓词下推、列裁剪、常量折叠、Join 重排等优化。
比如只查询两列时,Spark 不需要读取整张宽表的所有列。
SELECT user_id, sum(amount)
FROM orders
WHERE order_date >= '2026-05-01'
GROUP BY user_id;
如果底层是 Parquet,列裁剪和分区裁剪会显著减少扫描数据。
Join 策略
常见 Join 策略包括 Broadcast Join、Sort Merge Join、Shuffle Hash Join。
小表 Join 大表时,可以把小表广播到所有 Executor,避免大规模 Shuffle。
SELECT /*+ BROADCAST(dim_product) */
o.order_id,
p.category_name
FROM orders o
JOIN dim_product p
ON o.sku_id = p.sku_id;
如果两边都是大表,通常会触发 Shuffle,把相同 Join Key 的数据分到一起。
Shuffle 分区数
spark.sql.shuffle.partitions 控制 Spark SQL Shuffle 后的分区数。
分区太少,每个 Task 数据太大;分区太多,调度和小文件成本变高。
spark.sql.shuffle.partitions=400
这个值没有万能答案,要结合数据量、集群规模和任务类型调整。
数据倾斜
如果某个 key 的数据特别多,比如一个超级商家、一个热门商品,相关 Task 会比其他 Task 慢很多。
常见处理方式:
- 过滤异常 key。
- 热 key 单独处理。
- 加盐 Salting。
- 两阶段聚合。
- 使用 AQE 倾斜 Join 优化。
小结
Spark SQL 优化不是背参数,而是看执行计划。先理解是否发生 Shuffle,再看 Join 策略、分区数、数据倾斜和输入裁剪。