Spark调优有哪些参数?

Spark 参数调优的核心是先定位性能瓶颈(如资源不足、Shuffle 慢、GC 高、IO 耗时久),再针对性调参。以下按「资源分配、Shuffle 优化、内存管理、执行效率、数据读取」五大核心维度,梳理高频调优参数及对应场景:

一、资源分配类(解决“资源不够/资源浪费”)

核心是为 Executor/Driver 分配合理的 CPU/内存,避免“小任务占大资源”或“大任务缺资源”,是调优的基础。

核心参数 作用 调优场景 & 建议值
--executor-memory 单个 Executor 堆内存大小 场景:作业 OOM(内存溢出)、数据缓存不足、计算中间数据放不下
建议:根据数据量调整(4G/8G/16G),单 Executor 内存≤32G(过大易导致 GC 耗时增加)。
--executor-cores 单个 Executor 的 CPU 核数 场景:CPU 利用率低(核数太少)、Task 并行度不足;或核数太多导致 Task 竞争资源
建议:YARN 集群设 2-5 核(如 4 核),核数=Executor 内并行执行的 Task 数。
--num-executors Executor 总数量 场景:作业整体并行度低、数据处理慢
建议:结合集群总资源调整(10-50 个),预留 20% 集群资源避免抢占。
--driver-memory Driver 堆内存大小 场景:Driver OOM(如 collect 大结果、广播大变量)
建议:默认 1G,大作业调至 2G/4G;禁止 collect 超大数据到 Driver(核心原则)。
spark.executor.memoryOverhead Executor 堆外内存(非 JVM 内存) 场景:OOM 但堆内存未用满(堆外内存不足)
建议:默认是 executor-memory 的 10%,OOM 时调至 20%-50%(如 8G 堆内存对应 2G 堆外内存)。

二、Shuffle 优化类(解决“Shuffle 慢、数据倾斜”)

Shuffle 是 Spark 作业的核心瓶颈,这类参数直接影响数据分发效率,是调优的重点。

核心参数 作用 调优场景 & 建议值
spark.sql.shuffle.partitions SQL 作业 Shuffle 后的分区数 场景:数据倾斜(分区数太少)、Task 太少并行度低;或分区太多导致小 Task 过多
建议:默认 200,亿级数据调至 500-2000;需是 executor-cores × num-executors 的整数倍。
spark.default.parallelism RDD 作业 Shuffle 后的分区数(如 reduceByKey) 场景:RDD 聚合/Join 操作慢
建议:设为 num-executors × executor-cores × 2~3(如 10 个 Executor×4 核=40,设 80-120)。
spark.shuffle.file.buffer Shuffle 写磁盘的缓冲区大小 场景:Shuffle 写磁盘 IO 频繁、耗时久
建议:默认 32K,调至 64K/128K,减少磁盘 IO 次数。
spark.reducer.maxSizeInFlight Reduce 端拉取 Shuffle 数据的缓冲区大小 场景:Reduce 端拉取数据慢、网络 IO 高
建议:默认 48M,调至 64M/96M(避免过大导致 OOM)。
spark.shuffle.service.enabled 启用 External Shuffle Service 场景:Executor 退出导致 Shuffle 数据丢失,需重新计算
建议:设为 true,由 YARN NodeManager 托管 Shuffle 数据,减少重试。

三、内存管理类(解决“内存利用率低、GC 耗时高”)

Spark 内存分为「存储内存(缓存数据)」和「执行内存(Task 计算)」,需合理分配避免浪费或溢出。

核心参数 作用 调优场景 & 建议值
spark.memory.fraction 堆内存中“存储+执行”内存的占比(剩余为用户内存) 场景:缓存多但执行内存不足,或反之
建议:默认 0.6,缓存优先(如机器学习)调至 0.7-0.8;计算优先保持 0.6。
spark.memory.storageFraction “存储+执行”内存中,存储内存的占比 场景:缓存数据被频繁淘汰(存储不足),或执行内存不足导致溢出
建议:默认 0.5,缓存优先调至 0.6-0.7;计算优先调至 0.3-0.4。
spark.executor.extraJavaOptions Executor 的 JVM 参数(如 GC 策略) 场景:GC 耗时占比高(>20%)、作业卡顿
建议:配置 G1GC 减少 Full GC:
-XX:+UseG1GC -XX:G1HeapRegionSize=16M -XX:MaxGCPauseMillis=200

四、执行效率类(解决“Task 执行慢、数据处理低效”)

聚焦 Task 执行、序列化、广播等细节优化,进一步提升作业效率。

核心参数 作用 调优场景 & 建议值
spark.sql.adaptive.enabled 启用 AQE(自适应查询执行) 场景:统计信息不准、数据倾斜、复杂 Join
建议:Spark3.0+ 设为 true,自动调整 Join 策略、合并小分区,无需手动调 Shuffle 分区数。
spark.sql.optimizer.dynamicPartitionPruning.enabled 启用 DPP(动态分区裁剪) 场景:分区表 Join/查询,全表扫描耗时久
建议:设为 true,动态推导分区条件,仅扫描有效分区。
spark.broadcast.blockSize 广播变量阈值(超过则不广播) 场景:大表 Join 慢(未触发 Broadcast Join)
建议:默认 10M,调至 20M/30M(避免过大导致 OOM),让更大表触发 Broadcast Join。
spark.serializer 序列化方式 场景:Shuffle 序列化/反序列化耗时高、数据传输量大
建议:改为 org.apache.spark.serializer.KryoSerializer(默认 Java 序列化),减少序列化体积。

五、数据读取类(解决“文件读取慢、小文件多”)

针对 HDFS/Parquet/ORC 等数据源的读取优化,减少 IO 耗时。

核心参数 作用 调优场景 & 建议值
spark.sql.files.maxPartitionBytes 读取文件的分区大小(控制 Task 数) 场景:大文件 Task 太少(并行度低),或小文件多导致 Task 过多
建议:默认 128M,大文件调至 256M/512M;小文件调至 64M。
spark.sql.parquet.enableVectorizedReader 启用 Parquet 向量化读取 场景:读取 Parquet 文件慢、CPU 利用率低
建议:设为 true(Spark2.3+ 默认),批量读取数据提升 CPU 利用率。
spark.hadoop.mapreduce.input.fileinputformat.split.minsize HDFS 文件拆分最小大小 场景:小文件极多(十万级),Task 数量爆炸
建议:调至 64M/128M,合并小文件为一个 Task 处理。

总结:调优核心要点

  1. 先定位瓶颈:通过 Spark UI 查看 Shuffle 耗时、GC 占比、Task 执行时间,确定是资源/Shuffle/内存/IO 问题;
  2. 小步调优:每次仅调整 1-2 个参数,对比调优前后的执行时间、资源利用率;
  3. 优先级排序:先调资源分配(executor 内存/核数)→ 再调 Shuffle 分区数 → 启用 AQE/DPP → 最后优化内存/数据读取参数。

https://spark.apache.ac.cn/docs/latest/sql-performance-tuning.html

posted @ 2026-01-08 20:13  scales123  阅读(6)  评论(0)    收藏  举报