Apache Spark 任务性能调优与内存优化指南
解决 Spark 任务运行缓慢、Executor 频繁 OOM 或数据倾斜导致的“长尾”问题,通过一套标准化的配置和代码模式提升大规模数据处理的吞吐量。
为什么需要这个技能
在处理海量数据时,Spark 任务经常面临性能瓶颈。常见的痛点包括:由于 Shuffle 过多导致的网络 I/O 爆炸、个别分区数据量过大导致的 Task 运行缓慢(数据倾斜)、以及不合理的内存分配引发的 Full GC 或 OutOfMemoryError。
掌握 Spark 优化技能,可以让开发者从单纯的“写通代码”转向“高效运行”,通过合理配置 AQE(自适应查询执行)、选择正确的 Join 策略和分区方案,显著降低计算成本并缩短任务运行时间。
适用场景
- 慢查询优化:Spark 任务在某个 Stage 停留时间过长,进度条长时间卡在 99%。
- 内存调优:Executor 频繁出现
java.lang.OutOfMemoryError或磁盘 Spill 过多。 - 规模扩容:数据量级从 GB 增长到 TB,原有的并行度配置不再适用。
- Join 性能提升:处理大表关联小表时,希望通过 Broadcast 机制消除 Shuffle。
核心工作流
1. 启用自适应查询执行 (AQE)
现代 Spark 版本建议默认开启 AQE,它能在运行时根据统计信息自动合并小分区和处理倾斜 Join。
spark = (SparkSession.builder
.config("spark.sql.adaptive.enabled", "true")
.config("spark.sql.adaptive.coalescePartitions.enabled", "true")
.config("spark.sql.adaptive.skewJoin.enabled", "true")
.getOrCreate())
2. 优化 Join 策略
- Broadcast Join:当一张表足够小时(默认 <10MB),强制将其广播到所有 Executor,完全避免 Shuffle。
- Salty Join(加盐):针对严重的数据倾斜,通过给 Key 添加随机前缀将热点数据打散。
3. 精细化内存与分区管理
- 分区大小控制:目标分区大小应保持在 128MB - 256MB 之间。
- 持久化策略:根据内存压力选择
MEMORY_AND_DISK_SER(序列化存储),降低 GC 压力。
4. 数据格式优化
优先使用 Parquet 或 Delta Lake 格式,利用列式存储实现谓词下推(Predicate Pushdown)和列裁剪(Column Pruning),减少读取的数据量。
下载和安装
下载 spark-optimization 中文版 Skill ZIP
解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md。
你可能还需要
暂无推荐