Spark晓技术参数涵盖了其作为一款高性能分布式计算框架的核心特性,这些参数共同决定了Spark在数据处理、任务调度、资源管理及性能优化等方面的表现,以下从多个维度详细解析Spark的关键技术参数,包括核心配置、内存管理、任务调度、存储优化及高级特性等,并通过表格形式清晰呈现关键参数及其默认值与作用。

核心基础参数
Spark的核心参数主要涉及应用程序的基本配置,如应用程序名称、执行模式、主节点地址等,这些是启动Spark应用时必须明确的基础设置。
| 参数名称 | 默认值 | 作用说明 |
|---|---|---|
| spark.app.name | 未设置 | 应用程序的名称,用于在Spark UI中标识应用,便于监控和管理。 |
| spark.master | 未设置 | 指定Spark运行的主节点地址,如local(本地单线程)、local[K](本地K线程)、spark://host:port(集群模式)等。 |
| spark.executor.memory | 1g | 每个执行器(Executor)的堆内存大小,影响单个任务可处理的数据量。 |
| spark.executor.cores | 1 | 每个执行器分配的CPU核心数,决定执行器并行处理任务的能力。 |
| spark.driver.memory | 1g | 驱动器(Driver)的堆内存大小,用于存储RDD、任务调度及执行逻辑等。 |
| spark.submit.deployMode | client | 部署模式,client模式下Driver运行在客户端,cluster模式下Driver运行在集群节点,适用于生产环境。 |
内存管理参数
Spark的内存管理是其性能优化的关键,分为堆内存(On-Heap)和堆外内存(Off-Heap),涵盖执行内存、存储内存等区域,合理配置可避免内存溢出并提升数据处理效率。
| 参数名称 | 默认值 | 作用说明 |
|---|---|---|
| spark.memory.fraction | 6 | 堆内存中用于执行和存储内存的比例(总堆内存的60%),剩余40%用于用户数据、系统开销等。 |
| spark.memory.storageFraction | 5 | 执行和存储内存中,存储内存的比例(50%),即执行内存和存储内存各占可用内存的30%。 |
| spark.memory.offHeap.enabled | false | 是否启用堆外内存,启用后可减少GC压力,适合大数据量场景。 |
| spark.memory.offHeap.size | 0 | 堆外内存大小,需设置为大于0的值(如512m),单位为字节。 |
| spark.executor.memoryOverhead | executorMemory * 0.1, 最少384m | 执行器的内存开销,用于非堆内存需求(如JVM元数据、本地缓存等),防止OOM。 |
| spark.driver.memoryOverhead | driverMemory * 0.1, 最少384m | 驱动器的内存开销,作用同执行器内存开销。 |
任务调度与并行度参数
Spark通过任务调度器(如FIFO、FAIR、SchedulablePool)管理任务执行,并行度参数直接影响任务拆分粒度和集群资源利用率。
| 参数名称 | 默认值 | 作用说明 |
|---|---|---|
| spark.default.parallelism | 对于集群模式:所有执行器核心数总和;对于本地模式:最大可用CPU核心数 | 默认的任务并行度,决定RDD分区数,影响任务并行处理能力。 |
| spark.task.cpus | 1 | 每个任务占用的CPU核心数,默认为1,可设置为多核以提升单个任务计算效率。 |
| spark.task.maxFailures | 4 | 单个任务最大失败次数,超过后可能导致应用失败,需结合数据重试机制配置。 |
| spark.scheduler.mode | FIFO | 调度模式,FIFO(先进先出)或FAIR(公平调度),FAIR模式可支持多队列优先级。 |
| spark.speculation | false | 是否启用推测执行,对运行缓慢的任务启动副本,优先完成结果。 |
存储与序列化参数
Spark的数据存储(如HDFS、S3)和序列化方式直接影响数据读写效率,优化存储和序列化可显著降低IO开销。

| 参数名称 | 默认值 | 作用说明 |
|---|---|---|
| spark.serializer | org.apache.spark.serializer.KryoSerializer | 序列化类,默认为Java序列化,Kryo序列化速度更快且体积更小,需注册自定义类。 |
| spark.kryoserializer.buffer.max | 128m | Kryo序列化的缓冲区最大大小,避免处理大对象时溢出。 |
| spark.sql.shuffle.partitions | 200 | SQL和DataFrame操作中shuffle的分区数,影响shuffle阶段的数据分布和并行度。 |
| spark.default.parallelism | 参见任务调度参数 | 在shuffle操作中作为默认分区数,需根据集群规模和数据量调整。 |
| spark.sql.files.maxPartitionBytes | 128m | 读取单个文件时的最大分区字节数,避免单个分区过大导致内存不足。 |
Shuffle与网络参数
Shuffle是Spark中资源消耗较高的操作,其参数配置直接影响数据倾斜和集群性能。
| 参数名称 | 默认值 | 作用说明 |
|---|---|---|
| spark.shuffle.service.enabled | false | 是否启用Shuffle服务,允许执行器在应用结束后保留Shuffle数据供下游应用使用,减少数据重算。 |
| spark.shuffle.compress | true | 是否启用Shuffle数据压缩,默认启用,可减少网络传输和磁盘IO。 |
| spark.shuffle.spill.compress | true | Shuffle数据溢出到磁盘时是否压缩,默认启用,提升磁盘写入效率。 |
| spark.shuffle.partitions | 200 | Shuffle阶段的数据分区数,需结合数据量和集群资源调整,避免过多或过少分区。 |
| spark.shuffle.sort.bypassMergeThreshold | 100 | 对于可排序的Shuffle操作,当分区数小于此值时,可绕过排序合并步骤,提升性能。 |
高级优化参数
除上述核心参数外,Spark还提供了一系列高级参数,用于优化JVM性能、GC策略及容错能力。
| 参数名称 | 默认值 | 作用说明 |
|---|---|---|
| spark.dynamicAllocation.enabled | false | 是否启用动态资源分配,根据负载自动增减执行器数量,提升资源利用率。 |
| spark.dynamicAllocation.minExecutors | 0 | 动态分配模式下执行器的最小数量。 |
| spark.dynamicAllocation.maxExecutors | Int.MaxValue | 动态分配模式下执行器的最大数量。 |
| spark.executor.extraJavaOptions | 未设置 | JVM启动额外参数,可配置GC策略(如-XX:+UseG1GC)、日志级别等。 |
| spark.sql.adaptive.enabled | false | 是否启用自适应查询优化,自动调整分区数、合并操作等,提升SQL性能。 |
| spark.sql.adaptive.coalescePartitions.enabled | true | 自适应模式下是否合并小分区,减少任务数量。 |
相关问答FAQs
问题1:如何根据集群资源合理设置spark.executor.memory和spark.executor.cores?
解答:配置执行器内存和核心数需结合集群总资源(如总内存、CPU核心数)和应用需求,集群总内存为100GB,计划运行5个执行器,则每个执行器内存可设为16GB(100GB/5 - 内存开销),核心数可设为4(假设集群总核心数为20,20/5=4),需预留部分内存给系统开销(通过spark.executor.memoryOverhead配置),避免OOM,需确保spark.executor.cores * 执行器数量 ≤ 集群总核心数,避免资源争抢。
问题2:Spark中Kryo序列化比Java序列化更高效,如何启用并优化Kryo配置?
解答:启用Kryo序列化需设置spark.serializer为org.apache.spark.serializer.KryoSerializer,并注册自定义类(通过spark.kryo.registerClasses或Kryo.register方法),可通过spark.kryoserializer.buffer.max调整缓冲区大小(默认128m),避免大序列化对象溢出;对于复杂对象,实现Kryo的自定义序列化器(如继承KryoSerializer)可进一步提升性能,需注意,Kryo序列化不支持所有Java类型,需确保数据类型兼容。

