数据倾斜问题

数据倾斜 是分布式计算中最常见、最棘手的问题之一,指数据分布不均匀,导致部分节点负载过重,拖慢整个作业。

一、数据倾斜的表现

  • 某个 Reduce Task 运行几小时,其他几秒就完成
  • 执行过程中出现 OOM(内存溢出)
  • Spark UI 显示某个 Stage 的 Task 执行时间严重不均
  • 单个 Task 处理的数据量是平均值的几十倍

二、数据倾斜的原因

原因 示例 常见场景
Key 分布不均 null"" 、特定值过多 用户行为分析中空值
Join 倾斜 大表 join 小表,关联键分布不均 订单表 join 商品表,爆款商品
Group By 倾斜 某些 key 数据量极大 热点用户、爆款商品
Shuffle 导致 数据重分布时某分区过大 窗口函数、开窗操作

数据倾斜解决思路

  1. 诊断 :定位倾斜的 Key 和 Stage
  2. 分类 :判断是 Group By 还是 Join 导致的倾斜
  3. 选择方案
  • 空值/小数据 → 预处理
  • Group By → 两阶段聚合(加盐)
  • Join 小表 → MapJoin(广播)
  • Join 大表 → 拆分倾斜 Key
  1. 验证 :对比优化前后执行时间

三、实践

  • 优先使用 Spark 自适应执行(AQE)
  • 合理设置并行度(shuffle partitions)
  • 避免使用 groupByKey ,用 reduceByKey
  • 小表 Join 大表时使用广播
  • 定期监控数据分布变化
2 个赞