前言
在面向大数据的云数仓的 SQL 计算过程中,占用资源量最大的计算往往是 Shuffle。Shuffle 包含了将数据重分片和排序的两部分能力,是 SQL 执行层分布式计算的基础。用户作业在读表后,如果需要计算 Join,Group By,Window 等都需要做 Shuffle。
(图片来自于网络)
Shuffle 量的节省对作业性能优化至关重要。而如何在复杂数据 Shuffle 关系下选择最适用的 Cluster 表修改方案成为了 Shuffle 量节省的关键。MaxCompute 推出了针对这类多作业场景下全局最优 Cluster 表设置方案选择的能力,即 聚簇优化推荐。
以 MaxCompute 内部项目 SO 为例,该项目通过 MaxCompute 聚簇推荐(即 Cluster 表推荐) 调整表的聚簇属性,节省了 2 PB 每天的 Shuffle 量,进而每日节省了 7000+ CU 的计算资源。
如何使用 Cluster 表优化 Shuffle 资源消耗
Shuffle 的概念来源于 MapReduce 中 Mapper 侧传递数据到 Reducer 之前数据分布式重分片排序的过程。大数据量下分布式SQL计算无法离开Shuffle。
以最简单等值连接为例,
select * from t1, t2
where t1.key1 = t2.key2;
其分布式计划执行过程如下图所示
- M1,M2 这两个 Stage 中的 worker 分别读取 Table1,Table2 中不同文件的数据,并按照 join key 分发到下游。其中数据被写入 到 Shuffle 分片 P1,P2 还是 P3 取决于 join key hash 计算取模后的结果。
- J3 中不同的 worker 读取不同分片的数据,排序,再执行连接,最后写到各自的输出文件中。比如 J3.Worker1 读取两侧 P1 的数据。
(两边都需要 Shuffle)
在实际计划执行的过程中,最重的操作就是将两个大表的数据通过 Shuffle 过程传递到下游 J3 具体执行Join 的 Worker 中。消除 Shuffle 可以为 MaxCompute 用户节省大量 Shuffle 代价,节省CU,加速作业执行。
参考 MaxCompute Hash Clustering,我们可以将 Table2 按照 join 的键 key2 修改为 Hash Cluster 表的 Cluster Key。 修改后,因为数据已经在Join之前提前做好了分片和排序,所以不再需要Shuffle。优化器的 Shuffle Removal 优化能力会识别到这种场景,简化执行计划,新的执行计划如下图
(消除了一边 Shuffle)
其中 Table2 的 Shuffle 被消除,M2 在读 Table2 数据后可以直接进行Join。如果将Table1 也做类似修改,则整个执行计划可以完全避免 Shuffle 代价。对于更多的表在相同 key 上做 multi join 的场景也是相似的。
下面是两个实际执行的作业,可以看出消除 Shuffle 后,延迟和资源使用都大幅度减少。
使用 聚簇优化推荐 作为 Shuffle 优化利器
MaxCompute 聚簇优化推荐 基于历史数据分析,精确计算 Shuffle 量的潜在优化空间,针对 Shuffle 量较大(10GB以上)收益高,风险小的场景,针对性推荐用户修改 Cluster 表。
用户案例(项目名均为缩写)
- 以项目 SO 为例,该项目通过 MaxCompute 聚簇推荐(即 Cluster 表推荐) 调整表的聚簇属性,批量改造80 张表,节省了 2 PB / 天 的 Shuffle 量,进而节省了 7000+ CU / 天 的计算资源。
- 以项目 AO 为例 该项目通过 MaxCompute 聚簇推荐 找到了项目中 Shuffle 量最大的 15 张表,针对性修改后,节省了 1.4 PB / 天 的 Shuffle 量,进而节省了 3100 + CU / 天 的计算资源,237 小时/天 的作业关键路径延迟。
- 以项目 DA1 为例,根据 MaxCompute 聚簇推荐 的统计,该项目在 2025.07.23 的单日读表 Shuffle 量是 2.4 PB,其中 聚簇推荐表优化空间为 1.4 PB,以 1TB Shuffle 量对应 2~4 CU/天计算,该用户的潜在优化空间在 2800 ~ 5800 CU/天。
这些 CU 的节省量是按照 100% 满资源分配计算,实际项目中只有较少的时间作业的实际资源使用能达到资源购买量的峰值。
未来的计划
我们在不断的和用户推进沟通中,发现了较多实际场景中的改进点。未来我们会逐步支持
- 优化器: Shuffle Removal 支持大范围读表分区场景,支持写表前 CASE WHEN,COALESCE 增全量合并写入 Cluster Key,支持更好的数据倾斜识别等。
- 智能数仓:支持面向数据过滤性,数据压缩率,不同数据类型索引的推荐与自动应用。