home..
浅谈数据倾斜
一、概要
1. 什么是数据倾斜?
大量相同的 key 被 partition 分配到了一个分区,导致“一个人累死,其他人闲死”的情况。
2. 发生倾斜的症状?
- 绝大多数的 task 执行的都非常快,个别 task 极慢。
- 任务在历史周期执行正常,某天突然发生 OOM。
3. 定位发生倾斜的位置?
- 倾斜只会发生在 shuffle 阶段,而触发 shuffle 的算子有:
groupByKey、reduceByKey、aggregateByKey、join、distinct、cogroup、repartiton 等。针对代码中涉及这些算子的地方进行数据量探查,定位到倾斜位置。 - 通过 Spark UI 定位到倾斜所在的 stage,及其各个 task 分配的数据量,进而判断是否是因 task 分配不均导致了数据倾斜。
如果是 yarn-client 模式提交的,那么本地可以直接从 log 中找到当前运行到了第几个 stage。
如果是 yarn-cluster 模式提交的,那么从 Spark Web UI 里直接看到运行到了哪个 stage。
二、Hive 的数据倾斜
Hive 的执行是分阶段的,map 处理的数据量差异取决于上一个 stage 的 reduce 输出,所以解决倾斜问题,就是在思考如何将数据均匀地分配到各个 reduce 中。
1. 常见的倾斜原因
- key 分布不均;
- 业务数据本身特性;
- 模型设计问题;
- SQL 语句本身导致。
2. 倾斜的表现
最朴素的就是任务进度长时间卡在 99%(或100%),而在监控页面中发现只有少量(1个或几个)reduce 子任务因处理的数据量和其他 reduce 差异极大而尚未完成,倾斜的数据量甚至会多出一个数量级。具体倾斜程度可以通过具体 job 的 reducer counter 计数器协助定位。
MR 计数器参见:https://www.cnblogs.com/codeOfLife/p/5521356.html
3. 解决方案
- 调参
4. 典型业务场景举例
5. 监控预防
三、Spark 的数据倾斜
© 2026 Bingyang Yan