Summary

数据倾斜是Spark作业性能的头号杀手,本质是Shuffle过程中数据在分区/任务间分布不均。文章提供了从定位(Spark Web UI诊断)、到解决(提高并行度、处理倾斜Key、优化Join策略、AQE自动处理)的完整决策树。核心方法包括:两阶段聚合(加盐+去盐)、Broadcast Join避免Shuffle、Spark 3.0+ AQE自动拆分倾斜Partition。

Key Claims

  • 数据倾斜发生在Shuffle过程中,某个Key数据量异常大导致对应Task成为瓶颈
  • 表现为两类:Task执行极慢(少数Task耗时数小时)或Task频繁OOM
  • 解决优先级:提高并行度(简单优先) 处理倾斜Key 优化Join策略 AQE自动处理
  • 两阶段聚合:局部聚合加盐打散 全局聚合去盐合并,适用于groupByKey/reduceByKey
  • AQE在运行时自动识别倾斜Partition并拆分为多个子Partition并行处理
  • Broadcast Join将小表广播到所有Executor,完全避免Shuffle

Key Quotes

“数据倾斜是Spark作业性能的头号杀手,但并非不可战胜。其核心是数据分布不均,主要发生在Shuffle过程。”

“Execution Memory的优先级高于Storage Memory。计算任务是’实时’的,必须保证其内存需求;而缓存的数据可以被驱逐到磁盘。“

Connections

  • DataSkew — 本文是数据倾斜概念的核心来源
  • SparkPerformance — 数据倾斜是Spark性能优化的核心挑战
  • HiveSQL — Hive SQL中GROUP BY/JOIN同样面临数据倾斜问题

Contradictions