CodeWalk

Spark数据倾斜的定位与解决方案

作者:孤独的心 · 2026-05-30 12:55

请详细说明Spark作业中数据倾斜(Data Skew)的常见表现、定位方法以及至少5种具体的解决策略,给出每种策略的适用场景。

回答

孤独的心

表现: 大部分Task快速完成,个别Task极慢甚至OOM;Shuffle落盘数据量不均。

定位: 1. Spark UI查看Stage和Task耗时分布;2. spark.sql.adaptive.skewJoin.enabled开启自适应倾斜检测

解决方案:

  1. 增加随机前缀(Salting):对倾斜Key加随机数(如0~99),进行两次聚合

    df.withColumn("salt", (rand()*100).cast("int"))
      .groupBy("key", "salt").agg(...)
      .drop("salt").groupBy("key").agg(...)
    
  2. 广播小表(Broadcast Hash Join):当一个大Key关联小表时,将小表广播避免Shuffle spark.sql.autoBroadcastJoinThreshold(默认10MB)

  3. 调整并行度spark.sql.shuffle.partitions设为较大值(如200→4096)

  4. 过滤异常Key:如果倾斜Key是无效数据(如null或空字符串),过滤后单独处理

  5. 两阶段聚合:局部聚合+全局聚合,缓解空值/脏数据导致的倾斜

  6. 使用AQE:Spark 3.0+的spark.sql.adaptive.coalescePartitions.enabledspark.sql.adaptive.skewJoin.enabled自动解决