数据倾斜 是分布式计算中最常见、最棘手的问题之一,指数据分布不均匀,导致部分节点负载过重,拖慢整个作业。
一、数据倾斜的表现
- 某个 Reduce Task 运行几小时,其他几秒就完成
- 执行过程中出现 OOM(内存溢出)
- Spark UI 显示某个 Stage 的 Task 执行时间严重不均
- 单个 Task 处理的数据量是平均值的几十倍
二、数据倾斜的原因
| 原因 | 示例 | 常见场景 |
|---|---|---|
| Key 分布不均 |
null 、"" 、特定值过多 |
用户行为分析中空值 |
| Join 倾斜 | 大表 join 小表,关联键分布不均 | 订单表 join 商品表,爆款商品 |
| Group By 倾斜 | 某些 key 数据量极大 | 热点用户、爆款商品 |
| Shuffle 导致 | 数据重分布时某分区过大 | 窗口函数、开窗操作 |
数据倾斜解决思路 :
- 诊断 :定位倾斜的 Key 和 Stage
- 分类 :判断是 Group By 还是 Join 导致的倾斜
- 选择方案 :
- 空值/小数据 → 预处理
- Group By → 两阶段聚合(加盐)
- Join 小表 → MapJoin(广播)
- Join 大表 → 拆分倾斜 Key
- 验证 :对比优化前后执行时间
三、实践
- 优先使用 Spark 自适应执行(AQE)
- 合理设置并行度(shuffle partitions)
- 避免使用
groupByKey,用reduceByKey - 小表 Join 大表时使用广播
- 定期监控数据分布变化