迁移指南:Spark Core
- 从 Core 3.5 升级到 4.0
- 从 Core 3.5.3 升级到 3.5.4
- 从 Core 3.4 升级到 3.5
- 从 Core 3.3 升级到 3.4
- 从 Core 3.2 升级到 3.3
- 从 Core 3.1 升级到 3.2
- 从 Core 3.0 升级到 3.1
- 从 Core 2.4 升级到 3.0
从 Core 3.5 升级到 4.0
-
自 Spark 4.0 起,Spark 已将其所有内部对 servlet API 的引用从
javax
迁移到jakarta
。 -
自 Spark 4.0 起,Spark 将滚动事件日志以增量方式归档。要恢复 Spark 4.0 之前的行为,您可以将
spark.eventLog.rolling.enabled
设置为false
。 -
自 Spark 4.0 起,Spark 将压缩事件日志。要恢复 Spark 4.0 之前的行为,您可以将
spark.eventLog.compress
设置为false
。 -
自 Spark 4.0 起,Spark worker 将定期清理 worker 和已停止的应用目录。要恢复 Spark 4.0 之前的行为,您可以将
spark.worker.cleanup.enabled
设置为false
。 -
自 Spark 4.0 起,
spark.shuffle.service.db.backend
默认设置为ROCKSDB
,这意味着 Spark 将使用 RocksDB 存储进行 Shuffle 服务。要恢复 Spark 4.0 之前的行为,您可以将spark.shuffle.service.db.backend
设置为LEVELDB
。 -
在 Spark 4.0 中,已移除对 Apache Mesos 作为资源管理器的支持。
-
自 Spark 4.0 起,Spark 将以
10
的批处理大小分配执行器 Pod。要恢复旧有行为,您可以将spark.kubernetes.allocation.batch.size
设置为5
。 -
自 Spark 4.0 起,Spark 在持久卷声明中,使用
ReadWriteOncePod
而不是ReadWriteOnce
访问模式。要恢复旧有行为,您可以将spark.kubernetes.legacy.useReadWriteOnceAccessMode
设置为true
。 -
自 Spark 4.0 起,Spark 通过检查该 Pod 的所有容器来报告其执行器 Pod 状态。要恢复旧有行为,您可以将
spark.kubernetes.executor.checkAllContainers
设置为false
。 -
自 Spark 4.0 起,Spark 默认使用
~/.ivy2.5.2
作为 Ivy 用户目录,以将现有系统与 Apache Ivy 的不兼容性隔离开来。要恢复旧有行为,您可以将spark.jars.ivy
设置为~/.ivy2
。 -
自 Spark 4.0 起,当不再需要 Shuffle 时,Spark 使用外部 Shuffle 服务来删除已解除分配的执行器的 Shuffle 块。要恢复旧有行为,您可以将
spark.shuffle.service.removeShuffle
设置为false
。 -
自 Spark 4.0 起,Spark 日志中 Spark 任务名称的 MDC(映射诊断上下文)键已从
mdc.taskName
更改为task_name
。要使用键mdc.taskName
,您可以将spark.log.legacyTaskNameMdc.enabled
设置为true
。 -
自 Spark 4.0 起,Spark 的推测执行不那么激进,
spark.speculation.multiplier=3
和spark.speculation.quantile=0.9
。要恢复旧有行为,您可以将spark.speculation.multiplier=1.5
和spark.speculation.quantile=0.75
。 -
自 Spark 4.0 起,
spark.shuffle.unsafe.file.output.buffer
已弃用但仍然有效。请改用spark.shuffle.localDisk.file.output.buffer
。 -
自 Spark 4.0 起,当读取文件遇到
org.apache.hadoop.security.AccessControlException
和org.apache.hadoop.hdfs.BlockMissingException
时,即使spark.files.ignoreCorruptFiles
设置为true
,也会抛出异常并导致任务失败。
从 Core 3.5.3 升级到 3.5.4
- 自 Spark 3.5.4 起,当读取文件遇到
org.apache.hadoop.security.AccessControlException
和org.apache.hadoop.hdfs.BlockMissingException
时,即使spark.files.ignoreCorruptFiles
设置为true
,也会抛出异常并导致任务失败。
从 Core 3.4 升级到 3.5
-
自 Spark 3.5 起,
spark.yarn.executor.failuresValidityInterval
已弃用。请改用spark.executor.failuresValidityInterval
。 -
自 Spark 3.5 起,
spark.yarn.max.executor.failures
已弃用。请改用spark.executor.maxNumFailures
。
从 Core 3.3 升级到 3.4
-
自 Spark 3.4 起,Spark 驱动器将拥有
PersistentVolumeClaim
,并在它们未分配给活动执行器时尝试重用。要恢复 Spark 3.4 之前的行为,您可以将spark.kubernetes.driver.ownPersistentVolumeClaim
设置为false
并将spark.kubernetes.driver.reusePersistentVolumeClaim
设置为false
。 -
自 Spark 3.4 起,当启用动态分配且没有 shuffle 服务时,Spark 驱动器将跟踪 shuffle 数据。要恢复 Spark 3.4 之前的行为,您可以将
spark.dynamicAllocation.shuffleTracking.enabled
设置为false
。 -
自 Spark 3.4 起,如果
spark.decommission.enabled
和spark.storage.decommission.enabled
都为 true,Spark 将尝试退役缓存的 RDD 和 shuffle 块。要恢复 Spark 3.4 之前的行为,您可以将spark.storage.decommission.rddBlocks.enabled
和spark.storage.decommission.shuffleBlocks.enabled
都设置为false
。 -
自 Spark 3.4 起,如果
spark.history.store.hybridStore.enabled
为 true,Spark 将使用 RocksDB 存储。要恢复 Spark 3.4 之前的行为,您可以将spark.history.store.hybridStore.diskBackend
设置为LEVELDB
。
从 Core 3.2 升级到 3.3
- 自 Spark 3.3 起,Spark 将其 log4j 依赖项从 1.x 迁移到 2.x,因为 log4j 1.x 已达到生命周期结束并且不再受社区支持。2015 年 8 月之后报告的针对 log4j 1.x 的漏洞未被检查也不会被修复。用户应使用 log4j2 语法(XML、JSON、YAML 或 properties 格式)重写原始 log4j 属性文件。Spark 将 Spark 发行版中包含的
conf/log4j.properties.template
重写为conf/log4j2.properties.template
,采用 log4j2 属性格式。
从 Core 3.1 升级到 3.2
-
自 Spark 3.2 起,
spark.scheduler.allocation.file
支持使用 Hadoop 文件系统读取远程文件,这意味着如果路径没有方案,Spark 将遵守 Hadoop 配置来读取它。要恢复 Spark 3.2 之前的行为,您可以为spark.scheduler.allocation.file
指定本地方案,例如file:///path/to/file
。 -
自 Spark 3.2 起,
spark.hadoopRDD.ignoreEmptySplits
默认设置为true
,这意味着 Spark 不会为空的输入分片创建空分区。要恢复 Spark 3.2 之前的行为,您可以将spark.hadoopRDD.ignoreEmptySplits
设置为false
。 -
自 Spark 3.2 起,
spark.eventLog.compression.codec
默认设置为zstd
,这意味着 Spark 将不再回退使用spark.io.compression.codec
。 -
自 Spark 3.2 起,
spark.storage.replication.proactive
默认启用,这意味着 Spark 会在因执行器故障导致缓存 RDD 块副本丢失时尝试补充。要恢复 Spark 3.2 之前的行为,您可以将spark.storage.replication.proactive
设置为false
。 -
在 Spark 3.2 中,
spark.launcher.childConectionTimeout
已弃用(拼写错误)但仍然有效。请改用spark.launcher.childConnectionTimeout
。 -
在 Spark 3.2 中,对 Apache Mesos 作为资源管理器的支持已弃用,并将在未来版本中移除。
-
在 Spark 3.2 中,当应用程序自行终止时,Spark 将删除 K8s 驱动器服务资源。要恢复 Spark 3.2 之前的行为,您可以将
spark.kubernetes.driver.service.deleteOnTermination
设置为false
。
从 Core 3.0 升级到 3.1
-
在 Spark 3.0 及更早版本中,
SparkContext
可以在执行器中创建。自 Spark 3.1 起,在执行器中创建SparkContext
时将抛出异常。您可以通过在执行器中创建SparkContext
时设置配置spark.executor.allowSparkContext
来允许此操作。 -
在 Spark 3.0 及更早版本中,当 Spark 发行版内置 Hadoop 时,Spark 会将 Hadoop 类路径从
yarn.application.classpath
和mapreduce.application.classpath
传播到提交到 YARN 的 Spark 应用程序中。自 Spark 3.1 起,当 Spark 发行版内置 Hadoop 时,它不再传播,以防止因从 Hadoop 集群中获取的不同传递依赖(如 Guava 和 Jackson)导致的故障。要恢复 Spark 3.1 之前的行为,您可以将spark.yarn.populateHadoopClasspath
设置为true
。
从 Core 2.4 升级到 3.0
-
org.apache.spark.ExecutorPlugin
接口和相关配置已被org.apache.spark.api.plugin.SparkPlugin
取代,后者增加了新功能。使用旧接口的插件必须修改以扩展新接口。有关更多详细信息,请查看 监控 指南。 -
已移除弃用的方法
TaskContext.isRunningLocally
。本地执行已被移除,它总是返回false
。 -
已移除
ShuffleWriteMetrics
中弃用的方法shuffleBytesWritten
、shuffleWriteTime
和shuffleRecordsWritten
。请改用bytesWritten
、writeTime
和recordsWritten
。 -
已移除弃用的方法
AccumulableInfo.apply
,因为不允许创建AccumulableInfo
。 -
已移除弃用的累加器 v1 API,请改用 v2 API。
-
事件日志文件将以 UTF-8 编码写入,Spark History Server 将以 UTF-8 编码重放事件日志文件。之前 Spark 将事件日志文件以驱动器 JVM 进程的默认字符集写入,因此在编码不兼容的情况下,需要 Spark 2.x 的 Spark History Server 来读取旧的事件日志文件。
-
使用了新的获取 shuffle 块的协议。建议在运行 Spark 3.0 应用程序时升级外部 shuffle 服务。您仍然可以通过将配置
spark.shuffle.useOldFetchProtocol
设置为true
来使用旧的外部 shuffle 服务。否则,Spark 可能会遇到错误,并显示类似IllegalArgumentException: Unexpected message type: <number>
的消息。 -
SPARK_WORKER_INSTANCES
在 Standalone 模式下已弃用。建议在一个 worker 中启动多个执行器,并且每个节点启动一个 worker,而不是每个节点启动多个 worker 并每个 worker 启动一个执行器。