CodeWalk

大数据面试中数据倾斜问题全解

作者:我是大山 · 2026-05-30 12:55

数据倾斜是大数据面试中的高频场景题。请列举Join倾斜、GroupBy倾斜、CountDistinct等典型数据倾斜场景的解决方案。分别给出Spark和Flink中的数据倾斜解决方案(Salting/两阶段聚合/广播变量/AQE自适应等),并说明各种方案的适用场景和优缺点。

回答

我是大山

数据倾斜全解

一、Join倾斜

  • 场景:大表Join小表(如订单表Join商品表),热点Key导致OOM
  • Spark方案:
    1. 广播变量(Broadcast Join):小表<100M时自动或强制广播
    2. Salting:给热点Key加随机前缀拆分,Join后再聚合
  • Flink方案:
    1. 维表异步IO + LRU Cache
    2. MiniBatch优化合并小数据包

二、GroupBy倾斜

  • 场景:按城市分组,某些大城市数据量是平均的100倍
  • Spark方案:
    1. 两阶段聚合(盐化):先加随机前缀局部聚合,再去前缀全局聚合
    2. AQE(Spark 3.0+):自动倾斜Join优化 + 分区合并
  • Flink方案:
    1. LocalGlobal两阶段聚合
    2. 自定义KeyBy+Rebalance

三、CountDistinct倾斜

  • 方案:先用HyperLogLog近似计算,或拆分为Count + GroupBy

Spark AQE优势:Spark 3.0的AQE在运行时动态合并小分区、优化Join策略、处理倾斜

最佳实践

  1. 优先使用Broadcast Join
  2. 优化数据分布(合理分区键)
  3. 对大Key提前识别并特殊处理
  4. 监控并可视化Shuffle数据分布