大数据面试中数据倾斜问题全解
数据倾斜是大数据面试中的高频场景题。请列举Join倾斜、GroupBy倾斜、CountDistinct等典型数据倾斜场景的解决方案。分别给出Spark和Flink中的数据倾斜解决方案(Salting/两阶段聚合/广播变量/AQE自适应等),并说明各种方案的适用场景和优缺点。
回答
我是大山
数据倾斜全解
一、Join倾斜
- 场景:大表Join小表(如订单表Join商品表),热点Key导致OOM
- Spark方案:
- 广播变量(Broadcast Join):小表<100M时自动或强制广播
- Salting:给热点Key加随机前缀拆分,Join后再聚合
- Flink方案:
- 维表异步IO + LRU Cache
- MiniBatch优化合并小数据包
二、GroupBy倾斜
- 场景:按城市分组,某些大城市数据量是平均的100倍
- Spark方案:
- 两阶段聚合(盐化):先加随机前缀局部聚合,再去前缀全局聚合
- AQE(Spark 3.0+):自动倾斜Join优化 + 分区合并
- Flink方案:
- LocalGlobal两阶段聚合
- 自定义KeyBy+Rebalance
三、CountDistinct倾斜
- 方案:先用HyperLogLog近似计算,或拆分为Count + GroupBy
Spark AQE优势:Spark 3.0的AQE在运行时动态合并小分区、优化Join策略、处理倾斜
最佳实践:
- 优先使用Broadcast Join
- 优化数据分布(合理分区键)
- 对大Key提前识别并特殊处理
- 监控并可视化Shuffle数据分布