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 处理。 |
总结:调优核心要点
- 先定位瓶颈:通过 Spark UI 查看 Shuffle 耗时、GC 占比、Task 执行时间,确定是资源/Shuffle/内存/IO 问题;
- 小步调优:每次仅调整 1-2 个参数,对比调优前后的执行时间、资源利用率;
- 优先级排序:先调资源分配(executor 内存/核数)→ 再调 Shuffle 分区数 → 启用 AQE/DPP → 最后优化内存/数据读取参数。
https://spark.apache.ac.cn/docs/latest/sql-performance-tuning.html

浙公网安备 33010602011771号