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 策略、分区数、数据倾斜和输入裁剪。

参考链接