首页/数据/数据工程与 ETL 速查/数据倾斜的识别与处理
本包目录(311 条)
管道基础52 条
Kafka64 条调度与编排40 条数仓建模52 条数据质量50 条CDC 与同步53 条

数据倾斜的识别与处理

个别 key 数据量远超其他 key 时,单个 task 成为长尾:表现为多数 task 秒级完成、个别 task 长时间运行甚至 OOM。处理手段包括加盐两阶段聚合、广播小表、拆分热点 key。

表现任务长尾、单 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 处理。

易错点

  • 加盐分隔符与业务 key 冲突(key 里本身含 #)会导致阶段二的 key 解析错误
  • null key 参与分组时会集中到一个 task,分组前先过滤或打散 null

数据来源与参考

  • Apache Spark 官方文档:Performance Tuning(Data Skew 与 AQE)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌