迁移指南:Spark Core
- 从 Core 4.0 升级到 4.1
- 从 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 4.0 升级到 4.1
- 自 Spark 4.1 起,Spark Master 守护进程默认提供 REST API。若要恢复 Spark 4.1 之前的行为,可将
spark.master.rest.enabled设置为false。 - 自 Spark 4.1 起,Spark 默认会对 RDD 检查点进行压缩。若要恢复 Spark 4.1 之前的行为,可将
spark.checkpoint.compress设置为false。 - 自 Spark 4.1 起,Spark 默认对所有 S3 存储桶使用 Apache Hadoop Magic Committer。若要恢复 Spark 4.0 之前的行为,可将
spark.hadoop.fs.s3a.committer.magic.enabled设置为false。 - 自 Spark 4.1 起,如果配置
spark.sql.files.ignoreCorruptFiles或数据源选项ignoreCorruptFiles设置为true,则文件读取过程中遇到的java.lang.InternalError将不再导致任务失败。 - 自 Spark 4.1 起,Spark 将忽略
*.blacklist.*备用配置名称。若要恢复 Spark 4.1 之前的行为,请使用自 Spark 3.1.0 起存在的相应配置名称。 - 自 Spark 4.1 起,Spark 将使用多线程进行 LZF 压缩以并行压缩数据。若要恢复 Spark 4.1 之前的行为,可将
spark.io.compression.lzf.parallel.enabled设置为false。 - 自 Spark 4.1 起,Spark 默认使用原生 Netty IO 模式。若要恢复 Spark 4.1 之前的行为,可将
spark.io.mode.default设置为NIO。
从 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 在持久卷声明(Persistent Volume Claims)中使用
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(Mapped Diagnostic Context)键已从
mdc.taskName更改为task_name。若要使用键mdc.taskName,可将spark.log.legacyTaskNameMdc.enabled设置为true。 -
自 Spark 4.0 起,Spark 执行推测执行(speculative executions)的策略不再那么激进,默认参数调整为
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.sql.files.ignoreCorruptFiles或数据源选项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 Driver 将拥有
PersistentVolumeClaim并尝试重用未分配给活跃执行器的声明。若要恢复 Spark 3.4 之前的行为,可将spark.kubernetes.driver.ownPersistentVolumeClaim和spark.kubernetes.driver.reusePersistentVolumeClaim设置为false。 -
自 Spark 3.4 起,当在没有 Shuffle 服务的情况下启用动态分配时,Spark Driver 将跟踪 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 已达到生命周期终点,不再受社区支持。针对 log4j 1.x 的 2015 年 8 月之后报告的漏洞未进行检查且不会被修复。用户应使用 log4j2 语法(XML、JSON、YAML 或 properties 格式)重写原始 log4j 属性文件。Spark 已将分发包中包含的
conf/log4j.properties.template重写为使用 log4j2 属性格式的conf/log4j2.properties.template。
从 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 Driver 服务资源。若要恢复 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 起,为了防止因从 Hadoop 集群中获取不同的传递依赖项(如 Guava 和 Jackson)而导致的失败,内置 Hadoop 的 Spark 分发包不再进行此类传播。若要恢复 Spark 3.1 之前的行为,可将spark.yarn.populateHadoopClasspath设置为true。
从 Core 2.4 升级到 3.0
-
org.apache.spark.ExecutorPlugin接口及相关配置已被org.apache.spark.api.plugin.SparkPlugin取代,后者增加了新功能。使用旧接口的插件必须修改为扩展新接口。有关更多详情,请查看监控(Monitoring)指南。 -
已删除弃用的方法
TaskContext.isRunningLocally。本地执行已被删除,且该方法一直返回false。 -
已删除
ShuffleWriteMetrics中弃用的方法shuffleBytesWritten、shuffleWriteTime和shuffleRecordsWritten。请分别改用bytesWritten、writeTime和recordsWritten。 -
由于禁止创建
AccumulableInfo,已删除弃用的方法AccumulableInfo.apply。 -
已删除弃用的累加器 v1 API,请使用 v2 API。
-
事件日志文件将以 UTF-8 编码写入,Spark 历史服务器将以 UTF-8 编码回放事件日志文件。此前 Spark 以 Driver JVM 进程的默认字符集写入事件日志文件,因此若需读取旧版不兼容编码的事件日志文件,需要使用 Spark 2.x 的历史服务器。
-
使用了一种获取 Shuffle 块的新协议。建议在运行 Spark 3.0 应用程序时升级外部 Shuffle 服务。您仍可通过将配置
spark.shuffle.useOldFetchProtocol设置为true来使用旧版外部 Shuffle 服务。否则,Spark 可能会遇到类似于IllegalArgumentException: Unexpected message type: <number>的错误。 -
SPARK_WORKER_INSTANCES在独立模式(Standalone mode)下已弃用。建议在一个 Worker 中启动多个执行器,并每个节点启动一个 Worker,而不是在每个节点启动多个 Worker 并每个 Worker 启动一个执行器。