Spark数据倾斜的定位与解决方案
请详细说明Spark作业中数据倾斜(Data Skew)的常见表现、定位方法以及至少5种具体的解决策略,给出每种策略的适用场景。
回答
孤独的心
表现: 大部分Task快速完成,个别Task极慢甚至OOM;Shuffle落盘数据量不均。
定位: 1. Spark UI查看Stage和Task耗时分布;2. spark.sql.adaptive.skewJoin.enabled开启自适应倾斜检测
解决方案:
-
增加随机前缀(Salting):对倾斜Key加随机数(如0~99),进行两次聚合
df.withColumn("salt", (rand()*100).cast("int")) .groupBy("key", "salt").agg(...) .drop("salt").groupBy("key").agg(...) -
广播小表(Broadcast Hash Join):当一个大Key关联小表时,将小表广播避免Shuffle
spark.sql.autoBroadcastJoinThreshold(默认10MB) -
调整并行度:
spark.sql.shuffle.partitions设为较大值(如200→4096) -
过滤异常Key:如果倾斜Key是无效数据(如null或空字符串),过滤后单独处理
-
两阶段聚合:局部聚合+全局聚合,缓解空值/脏数据导致的倾斜
-
使用AQE:Spark 3.0+的
spark.sql.adaptive.coalescePartitions.enabled和spark.sql.adaptive.skewJoin.enabled自动解决