Spark应用配置参数说明

更新时间:
复制 MD 格式

云原生数据仓库 AnalyticDB MySQL 版(AnalyticDB for MySQL)Spark配置参数跟开源Spark中的配置参数基本一致。本文介绍AnalyticDB for MySQL与开源Spark用法不一致的配置参数。

使用说明

Spark应用配置参数用于配置和调整Spark应用程序的行为和性能。使用不同的Spark开发工具,应用配置参数的格式不同。

开发工具

配置参数格式

配置参数示例

SQL开发编辑器

set key=value;

set spark.sql.hive.metastore.version=adb;

Spark Jar开发编辑器

"key": "value"

"spark.sql.hive.metastore.version":"adb"

Notebook开发编辑器

"key": "value"

"spark.sql.hive.metastore.version":"adb"

spark-submit命令行工具

key=value

spark.sql.hive.metastore.version=adb

指定DriverExecutor资源

参数名称

是否必填

默认值

参数说明

对应开源Spark参数名称

spark.adb.acuPerApp

单个Spark作业执行时所使用的ACU,取值范围为[2,Job型资源组计算最大资源]。

配置该参数后,系统会自动计算并配置Spark Driver规格、Spark Executor规格和Spark Executor节点个数。

点击查看spark.adb.acuPerApp的配置策略

  • 同时配置spark.adb.acuPerApp和其他所有资源参数(包括spark.driver.resourceSpec、spark.executor.resourceSpecspark.executor.instances)时,spark.adb.acuPerApp无效,其他资源参数取值不变。

  • 只配置spark.adb.acuPerApp时,spark.adb.acuPerApp有效,其他所有资源参数将根据spark.adb.acuPerApp自动计算并配置。

  • 在其他配置组合中,spark.adb.acuPerApp有效,同时会根据此参数自动计算未明确配置的资源参数(spark.driver.resourceSpec、spark.executor.resourceSpecspark.executor.instances),而已经明确配置的参数取值保持不变。

spark.driver.resourceSpec

medium

Spark Driver的资源规格。不同型号的取值对应不同的规格,详情请参见Spark资源规格列表的型号列。

重要

提交Spark应用时,可使用开源Spark参数,且取值需为Spark资源规格列表中的核数和内存。

例如CONF spark.driver.resourceSpec = c.small;,则Spark Driver的资源规格为12 GB。

spark.driver.coresspark.driver.memory

spark.executor.resourceSpec

medium

Spark Executor的资源规格。不同型号的取值对应不同的规格,详情请参见Spark资源规格列表的型号列。

重要

提交Spark应用时,可使用开源Spark参数,且取值需为Spark资源规格列表中的核数和内存。

例如CONF spark.executor.resourceSpec = c.small;,则Spark Executor的资源规格为12 GB。

spark.executor.coresspark.executor.memory

spark.executor.instances

Job型资源组计算最大资源/5

启动的Spark Executor节点个数。

spark.executor.instances

spark.adb.driverDiskSize

Spark Driver节点中挂载的额外磁盘容量, 应用于业务上需要较大磁盘空间的场景。默认挂载目录为/user_data_dir。

取值范围为(0,100],单位为GiB,例如:spark.adb.driverDiskSize=50Gi,表示将Spark Driver节点中挂载的额外磁盘容量设置为50 GiB。

spark.adb.executorDiskSize

Spark Executor节点中挂载的额外磁盘容量, 应用于Shuffle数据写入。默认挂载目录为/shuffle_volume。

取值范围为(0,100],单位为GiB,例如:spark.adb.executorDiskSize=50Gi,表示将Spark Executor节点中挂载的额外磁盘容量设置为50 GiB。

Spark资源规格列表

重要

执行Spark作业时,既可以使用预留资源,也可以使用弹性资源。如果使用Job型资源组的按需弹性资源执行Spark作业,会根据Spark资源规格以及资源规格的CPU内存比计算使用的ACU数量,具体计算方法如下。

  • CPU内存比为1:2,使用的ACU数量=Spark资源规格核数*0.8。

  • CPU内存比为1:4,使用的ACU数量=Spark资源规格核数*1。

  • CPU内存比为1:8,使用的ACU数量=Spark资源规格核数*1.5。

按需弹性资源的计费价格,详情请参见湖仓版产品定价

表 1. Spark资源规格列表

型号(Type)

规格

使用的ACU数量

CPU(Core)

内存(GB)

磁盘空间1(GB)

c.small

1

2

20

0.8

small

1

4

20

1

m.small

1

8

20

1.5

c.medium

2

4

20

1.6

medium

2

8

20

2

m.medium

2

16

20

3

c.large

4

8

20

3.2

large

4

16

20

4

m.large

4

32

20

6

c.xlarge

8

16

20

6.4

xlarge

8

32

20

8

m.xlarge

8

64

20

12

c.2xlarge

16

32

20

12.8

2xlarge

16

64

20

16

m.2xlarge

16

128

20

24

m.4xlarge

32

256

20

48

m.8xlarge

64

512

20

96

说明

1磁盘空间:预估会有1%左右的系统占用,您可用的空间大小可能不足20 GB。

示例

Spark作业分配32Executor,每个Executor的规格为 medium(即28 GB),每个Driver的规格为small(即14 GB),此时整个作业最多可分配总计65 ACU的计算资源。

{
   "spark.driver.resourceSpec":"small",
   "spark.executor.resourceSpec":"medium",
   "spark.executor.instances":"32",
   "spark.adb.executorDiskSize":"100Gi"
}

指定Spark作业优先级

参数名称

是否必填

默认值

参数说明

spark.adb.priority

NORMAL

指定Spark作业的优先级。当因资源不足导致Spark作业排队执行时,等待队列中优先级更高的Spark作业优先获取运行资源,从而保障其能更早进入执行状态。取值说明:

  • HIGH:高优先级。

  • NORMAL:一般优先级。

  • LOW:低优先级。

  • LOWEST:最低优先级。

重要

建议设置Streaming类(长期运行的流作业)Spark作业的优先级为HIGH。

连接元数据服务

参数名称

是否必填

默认值

参数说明

spark.sql.catalogImplementation

  • Spark SQL类型作业的默认值为:hive

  • Spark SQL类型作业的默认值:in-memory

指定连接元数据服务的类型,支持如下配置:

  • hive:连接Spark内置的Hive MetaStore中的元数据信息。

  • in-memory:连接临时目录中的元数据信息。

spark.sql.hive.metastore.version

  • Spark SQL类型作业的默认值:adb

  • Spark SQL类型作业的默认值:<hive_version>

指定采用元数据服务版本,支持如下配置:

  • adb:连接AnalyticDB for MySQL中的元数据信息。

  • <hive_version>:指定Hive MetaStore的版本。

说明

示例

  • 连接AnalyticDB for MySQL中的元数据信息,配置如下:

    spark.sql.hive.metastore.version=adb;
  • 连接Spark内置的Hive MetaStore中的元数据信息,配置如下:

    spark.sql.catalogImplementation=hive;
    spark.sql.hive.metastore.version=2.1.3;
  • 连接临时目录中的元数据信息,配置如下:

    spark.sql.catalogImplementation=in-memory;

配置Spark UI

参数名称

是否必填

默认值

参数说明

spark.app.log.rootPath

oss://<aliyun-oa-adb-spark-阿里云账号ID-oss-可用区ID>/<集群ID>/<Spark应用ID>

存储AnalyticDB for MySQLSpark作业日志及Linux操作系统输出内容的路径。

默认OSS路径Spark应用ID的文件夹下存储的内容如下:

  • 名称为Spark应用ID-000X的文件存储用于Spark UI渲染的Spark Event日志。

  • 名称为driver和数字的文件夹存储对应的节点日志。

  • 名称为stdoutstderr的文件夹存储Linux操作系统的输出内容。

spark.adb.event.logUploadDuration

false

是否记录EventLog上传时消耗的时间。

spark.adb.buffer.maxNumEvents

1000

Driver内部缓存Event的最大数量。

spark.adb.payload.maxNumEvents

10000

一次上传的EventOSS的最大数量。

spark.adb.event.pollingIntervalSecs

0.5

Event上传到OSS时,两次上传之间的时间间隔,单位为秒。例如:设置为每隔0.5秒上传一次。

spark.adb.event.maxPollingIntervalSecs

60

重新上传EventOSS需要等待的最大时间间隔。单位为秒。如果上传失败需要重新上传,两次上传的时间间隔会大于spark.adb.event.pollingIntervalSecs,但时间间隔最大不会超过spark.adb.event.maxPollingIntervalSecs

spark.adb.event.maxWaitOnEndSecs

10

Event上传到OSS的最大等待时间,单位为秒。最大等待时间为开始上传到完成上传的时间间隔。超过最大等待时间会重新上传。

spark.adb.event.waitForPendingPayloadsSleepIntervalSecs

1

重新上传Event完成的最大时间,单位为秒。在超过 spark.adb.event.maxWaitOnEndSecs的时间后未完成上传,重新上传需要等待的时间。

spark.adb.eventLog.rolling.maxFileSize

209715200

EventLogOSS存储文件的切片大小,单位为 byte。EventLogOSS上是多个文件存储,例如 Eventlog.0、Eventlog.1,可控制Eventlog.0、Eventlog.1文件的大小。

RAM用户授权

参数名称

是否必填

默认值

参数说明

spark.adb.roleArn

RAM系统中授予提交Spark应用的RAM用户的角色ARN,详情请参见RAM角色概览。RAM用户提交应用时,需要填写该参数,阿里云账号无需填写该参数。

说明

如果已在控制台为RAM用户进行了快速授权操作,则无需再通过配置参数为该RAM用户授权。详情请参见账号授权

内置数据源连接器

参数名称

是否必填

默认值

参数说明

spark.adb.connectors

启用AnalyticDB for MySQLSpark内置的连接器,连接器名称以逗号分隔,目前可选的连接器有oss、hudi、delta、adb、odps、external_hive、jindo、default。

spark.hadoop.io.compression.codec.snappy.native

false

标识Snappy文件是否为标准Snappy文件。Hadoop默认识别的是Hadoop修改过的Snappy格式文件。设置为true时将使用标准Snappy库解压,否则使用hadoop默认的Snappy库解压。

VPC访问和连接数据源

参数名称

是否必填

默认值

参数说明

spark.adb.eni.enabled

false

是否开启ENI访问的开关。

如果是通过外表访问其他外部数据源,则需要打开ENI访问开关。取值说明:

  • true:开启

  • false:关闭

spark.adb.eni.vswitchId

弹性网卡的交换机ID。

如果是从ECS通过VPC网络连接AnalyticDB for MySQL,需要配置VPC网络的交换机ID。

说明

当配置了开启VPC网络时,需要同时开启ENI访问,即配置spark.adb.eni.enabledtrue。

spark.adb.eni.securityGroupId

弹性网卡的安全组ID。

如果是从ECS通过VPC网络连接AnalyticDB for MySQL,需配置安全组ID。

说明

当配置了开启VPC网络时,需要同时开启ENI访问,即配置spark.adb.eni.enabledtrue。

spark.adb.eni.extraHosts

需要额外传入的IPHost的映射关系,以便Spark能正确解析数据源中的Host。如连接自建的Hive数据源,则需要传入此参数。

说明
  • IPHost之间用空格分隔。多个IP和域名用英文逗号(,)分隔,如ip0 master0,ip1 master1

  • 当配置了连接数据源时,需要同时开启ENI网络,即配置spark.adb.eni.enabledtrue。

spark.adb.eni.adbHostAlias.enabled

false

是否开启自动将AnalyticDB for MySQL服务所需要的域名解析信息写入到域名映射表中。取值说明:

  • true:开启。

  • false:关闭。

在通过ENI连接EMR Hive读写数据时,需要开启。

应用重试

参数名称

是否必填

默认值

参数说明

spark.adb.maxAttempts

1

最大尝试次数,默认值为1,代表不需要重试。

假设配置为3,则这个应用在一个滑动窗口期时间内最多尝试3次。

spark.adb.attemptFailuresValidityInterval

Integer.MAX

重试计数的滑动窗口时间,单位:秒(s)。

假设配置为6000,那么当一次重试失败后,系统会计算过去6000s共进行了多少次重试,如果重试次数少于maxAttempts的配置值,则会继续重试。

Executor调度超时自动终止(Scheduling Watchdog)

Executor Pod因底层资源不足(如ECI库存耗尽、资源配额超限、节点亲和性无法满足等)长时间处于Pending状态时,作业会持续等待,既占用Driver资源,也阻塞后续调度。开启该功能后,当不可调度的Executor占比与等待时长同时达到设定阈值,系统将自动判定作业失败并释放资源,实现快速失败(Fail Fast)。

使用场景

该功能适用于在共享集群中运行大量Spark作业,且希望在资源不足时作业尽快失败、而非无限等待的场景。典型场景如下:

  • ECI资源不足:使用阿里云弹性容器实例(ECI)运行Executor时,底层规格库存不足,导致Pod长时间处于Pending状态。

  • 集群资源配额超限:命名空间或资源组的CPU、内存配额已满,新的Executor无法调度。

  • 批量作业快速重试:希望作业在资源不可用时尽快失败,由上层调度系统(如Airflow)决定重试策略。

配置方法

提交Spark作业时,通过配置以下参数启用并调整Watchdog的行为。

参数名称

是否必填

默认值

参数说明

spark.adb.terminateOnPending.enabled

启用该功能时必填

false

是否为该作业启用Executor调度超时自动终止。取值:

  • true:启用。

  • false(默认值):不启用。

默认关闭。设置为true后,本功能及相关参数方才生效。

spark.adb.terminateOnPending.timeoutSec

610

Executor Pod持续处于Pending状态的容忍时间,单位为秒。从Executor Pod首次被检测到不可调度时开始计时,当等待时长超过该值、且同时满足spark.adb.terminateOnPending.executorRatio条件时,触发作业终止。

建议取值:610~900。

spark.adb.terminateOnPending.executorRatio

0.5

触发终止的不可调度Executor占比阈值,取值范围为(0,1.0]。占比的计算方式为:不可调度Executor数量/期望Executor总数。当占比达到该值、且Pending时长超过spark.adb.terminateOnPending.timeoutSec时,触发作业终止。

取值越小,触发越灵敏;取值越大,触发越宽松:

  • 0.3:当30%的Executor不可调度时即触发,适合对延迟敏感的作业。

  • 0.5(默认值):半数Executor不可调度时触发。

  • 0.8~1.0:大部分或全部Executor不可调度时才触发,适合资源动态波动的环境。

其中,期望Executor总数按以下优先级取值:

  1. spark.executor.instances(静态分配)。

  2. spark.dynamicAllocation.initialExecutors(动态分配的初始值)。

  3. spark.dynamicAllocation.maxExecutors(动态分配的最大值)。

  4. 以上参数均未配置时,取当前不可调度的Pod数量。

重要

spark.adb.terminateOnPending.executorRatiospark.adb.terminateOnPending.timeoutSec必须同时满足才会触发终止。仅等待超时但占比未达标,或占比达标但等待时长不足,都不会触发。

配置示例如下:为作业启用调度超时自动终止,当半数Executor持续不可调度超过300秒时终止作业。

{
   "spark.adb.terminateOnPending.enabled":"true",
   "spark.adb.terminateOnPending.timeoutSec":"300",
   "spark.adb.terminateOnPending.executorRatio":"0.5"
}

作业失败后的表现

触发终止后,作业表现如下:

  • 作业状态:SparkApplication先进入FailingState,随后变为FailedState

  • 错误信息status.appState.errorMessage中包含结构化的故障诊断信息。

  • Driver Pod:被主动删除以释放资源。

错误信息示例如下:

[ResourceQuotaExceeded] executors unschedulable: 5/10 (50%) for 5m12s; threshold ratio≥50%, age≥5m0s
denom=10 (spec.executor.instances), distinct reasons=1, oldest pod=my-job-exec-3 (pending since 2026-06-01T10:16:34Z)
scheduler reason: Unschedulable
scheduler message: 0/1279 nodes are available: quota not enough, quotaName: amv-x

错误信息开头方括号内标识了系统自动分类的故障原因。各分类的含义及处理建议如下:

故障分类

含义

处理建议

ECIPendingTimeout

ECI Pod超过最大Pending时长。

检查ECI规格库存,或切换ECI规格。

ResourceQuotaExceeded

资源配额不足。

联系管理员扩容配额,或减少作业并发。

InsufficientClusterResources

集群CPU或内存不足。

等待资源释放,或扩容集群。

说明

Watchdog仅将作业标记为失败,后续是否重试由作业的restartPolicy控制,与作业正常失败时的行为一致。关于应用重试,请参见本文应用重试

指定Spark作业的运行环境

使用Virtual Environments打包Python环境,提交Spark作业时需配置以下参数。

参数名称

是否必填

默认值

参数说明

spark.pyspark.python

指定要使用的Python解释器的本地路径。

指定Spark版本

参数名称

是否必填

默认值

参数说明

spark.adb.version

3.2

指定Spark的版本。取值:

  • 2.4

  • 3.2

  • 3.3

  • 3.5

  • 4.0

高性能向量化执行引擎

参数名称

是否必填

默认值

参数说明

spark.adb.native.enabled

false

是否开启高性能向量化执行引擎执行作业,AnalyticDB Spark内置高性能向量化执行引擎,与开源Spark完全兼容,您无需对现有代码做任何修改即可开启。

湖存储加速

参数名称

是否必填

默认值

参数说明

spark.adb.lakecache.enabled

false

是否开启湖存储加速(LakeCache)

AnalyticDB for MySQL不支持的配置参数

AnalyticDB for MySQLSpark暂不支持以下开源Spark的配置参数。这些配置参数对于AnalyticDB for MySQLSpark不会生效。

Useless options(these options will be ignored):
  --deploy-mode
  --master
  --packages, please use `--jars` instead
  --exclude-packages
  --proxy-user
  --repositories
  --keytab
  --principal
  --queue
  --total-executor-cores
  --driver-library-path
  --driver-class-path
  --supervise
  -S,--silent
  -i <filename>