| 表现 | 任务长尾、单 task 内存溢出、spill 严重 |
|---|---|
| 成因 | 热点 key、null key、数据分布天然不均 |
| 手段 | 加盐、两阶段聚合、广播、单独处理热点 |
两阶段加盐聚合
两阶段加盐聚合
-- 阶段一:对热 key 加随机后缀做局部聚合
CREATE TABLE tmp_agg AS
SELECT concat(k, '#', cast(floor(rand() * 10) as string)) AS k_salt,
sum(v) AS part_sum
FROM src GROUP BY concat(k, '#', cast(floor(rand() * 10) as string));
-- 阶段二:去掉后缀再合并
SELECT split(k_salt, '#')[0] AS k, sum(part_sum) AS total
FROM tmp_agg GROUP BY split(k_salt, '#')[0];先确认是 key 倾斜还是分区倾斜:源数据文件大小不均导致的分区倾斜要靠重分区或 AQE 处理。