资讯动态

Apache Spark Core 迁移指南实战解析:从 2.4 到 4.3 的默认行为变更与配置回退全览

发布时间:2026/9/19 11:56:44 来源:尧图企业网站定制
Apache Spark Core 迁移指南实战解析从 2.4 到 4.3 的默认行为变更与配置回退全览【免费下载链接】sparkApache Spark - A unified analytics engine for large-scale data processing项目地址: https://gitcode.com/gh_mirrors/sp/spark本篇指南系统梳理 Apache Spark 当前仓库中 docs/core-migration-guide.md 所记录的 Spark Core 各版本迁移要点覆盖从 2.4 升级到 4.3 期间的所有默认行为变更、废弃接口与配置项迁移。读者完成后将掌握每个变更背后的技术动机、如何通过spark.*配置键一键回退旧行为以及这些配置在 core/src/main/scala/org/apache/spark/internal/config/package.scala 等源码中的真实定义与默认值。Upgrading from Core 4.2 to 4.3安全加固与资源分配精细化Spark 4.3 的迁移要点集中在序列化压缩、Kubernetes 安全上下文、Spark UI 安全响应头、Master REST API 限制以及 Python 执行器内存分配五个方向。以下逐项说明变更内容与回退方法。RDD 分区序列化默认压缩自 Spark 4.3 起序列化后的 RDD 分区默认进行压缩可降低网络与存储开销。若要恢复旧行为设置spark.rdd.compressfalse。该配置在 core/src/main/scala/org/apache/spark/internal/config/package.scala#L2543 中以ConfigBuilder(spark.rdd.compress)注册属于 Spark Core 运行时的核心开关。执行器 Pod 直连 Driver Pod IP自 Spark 4.3 起执行器 Pod 不再通过 Driver 的 Kubernetes Service而是直接用 Driver Pod IP 建立连接。若需恢复旧行为设置spark.kubernetes.executor.useDriverPodIPfalse。该键在 resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/Config.scala#L168-L173 中定义文档注明如果为 true执行器 Pod 直接使用 Driver Pod IP 而非 Driver Service默认值为true版本号标注为4.1.0说明该能力自 4.1 引入、4.3 起成为默认。容器 SecurityContext 禁止特权提升自 Spark 4.3 起Spark 在 Driver 与 Executor 容器的 SecurityContext 中默认将allowPrivilegeEscalation设为false容器无法获得超过其父进程的特权。可通过spark.kubernetes.securityContext.allowPrivilegeEscalationtrue恢复旧行为。该配置在 Config.scala#L136-L146 定义版本号4.3.0默认false。同时提供两个容器类型细粒度配置spark.kubernetes.driver.securityContext.allowPrivilegeEscalation与spark.kubernetes.executor.securityContext.allowPrivilegeEscalationConfig.scala#L148-L166未设置时回退到全局配置。Spark UI 的 CSP 与 XSS 防护自 Spark 4.3 起Spark UI 默认发送 HTTPContent-Security-PolicyCSP响应头限制浏览器加载资源的来源可从根源上缓解 XSS 与点击劫持clickjacking风险。如需恢复旧行为设置spark.ui.contentSecurityPolicy.enabledfalse。相关实现位于 core/src/main/scala/org/apache/spark/ui/HttpSecurityFilter.scalaCSP 默认策略为default-src self; script-src self nonce-$cspNonce; style-src self unsafe-inline; img-src self data:; object-src none; base-uri self并动态生成 nonce 用于内联脚本白名单HttpSecurityFilter.scala#L81-L84。自 4.3 起spark.ui.allowFramingFrom改用 CSPframe-ancestors指令替代已被现代浏览器Chrome、Firefox、Edge、Safari忽略的X-Frame-Options: ALLOW-FROM。该指令仅在spark.ui.contentSecurityPolicy.enabledtrue默认时生效当 CSP 被禁用时无论allowFramingFrom取值如何都会固定使用X-Frame-Options: SAMEORIGINHttpSecurityFilter.scala#L56-L89。注意DENY会被映射为frame-ancestors none而SAMEORIGIN被过滤后回退为frame-ancestors self同时会对 URI 做换行剥离与分号截断以防止头注入。spark.ui.xXssProtection默认值从1; modeblock改为0。原因是 XSS Auditor 已被 Chrome 与 Edge 移除、Firefox 从未实现且在仍支持它的 Safari 上存在侧信道漏洞风险。如需恢复旧行为可显式设置spark.ui.xXssProtection1; modeblockHttpSecurityFilter.scala#L112。此外该过滤器还会设置Cache-Control: no-cache, no-store, must-revalidate、按需设置X-Content-Type-Options: nosniff与 HTTPS 下的Strict-Transport-Security并对请求参数做 HTML 转义与新行、单引号剥离构成完整的多层 Web 安全防线。Master REST API 请求体大小限制自 Spark 4.3 起Master REST API 会拒绝请求体超过spark.master.rest.maxRequestBodySize默认100m的提交并返回 HTTP 413。如需允许更大的请求体调大该配置即可。该配置在 package.scala#L2333-L2342 中以bytesConf(ByteUnit.BYTE)定义校验值为正数默认100m版本号4.3.0。同时 Spark 4.3 还新增了spark.master.rest.allowedAppResourcePatternspackage.scala#L2320-L2331可对应用 JAR 路径做正则白名单过滤进一步收紧提交入口。Python 执行器内存分配的精细化自 Spark 4.3 起spark.task.cpus支持小数取值且执行器级别的spark.executor.pyspark.memory分配从按原始 CPU 核数改为按执行器并发任务能力拆分当spark.task.cpus大于 1 时每个 Python Worker 获得按比例更大的份额启用动态分配时若自定义资源如 GPU限制了并发度则更少的并发 Worker 共享整份内存分配关闭动态分配时各份额仍与每个任务的 cpus 成正比保证混合负载共享同一执行器时不超预算未显式请求pysparkMemory的资源画像ResourceProfile阶段现在会继承默认画像的分配额与执行器的大小计算方式一致因此此前在无内存上限下运行的 Python Worker 会被纳入限额但所有并发 Worker 的聚合上限仍不超出配置的分配额。同时若spark.executor.pyspark.memory为正数但太小、无法保证每个并发任务槽至少 1 MiB则 Python 任务会直接失败并报错而不再静默地无内存上限运行。spark.executor.pyspark.memory0依然表示禁用限制。恢复策略调大该配置或降低执行器并发任务能力。Upgrading from Core 4.1 to 4.2虚拟线程与 Kubernetes 网络策略Master REST API 默认启用 Java 21 虚拟线程自 Spark 4.2 起运行在 Java 21 及以上时Spark Master REST API 默认使用 Java 21 虚拟线程virtual threads。spark.master.rest.virtualThread.enabled在 package.scala#L2313-L2318 定义版本号4.0.0默认true。如需恢复旧行为设置为false。相关配套配置还包括spark.master.rest.host、spark.master.rest.port默认6066、spark.master.rest.maxThreads默认200与spark.master.rest.filters。执行器 Pod 批量分配与默认 NetworkPolicy自 Spark 4.2 起执行器 Pod 以批量大小为20进行分配此前为10。可通过spark.kubernetes.allocation.batch.size10恢复旧行为该键在 Config.scala#L599 附近定义。自 Spark 4.2 起Spark 默认配置NetworkPolicy使执行器 Pod 仅接受来自同一作业的 Driver 与对等执行器的入站流量。若要关闭并恢复旧行为需将spark.kubernetes.driver.pod.excludedFeatureSteps设置为org.apache.spark.deploy.k8s.features.NetworkPolicyFeatureStep从 Driver Pod 的特性步骤feature steps中排除该功能配置定义见 Config.scala#L532。Upgrading from Core 4.0 to 4.1Master REST 默认开启与压缩/IO 默认值变更Master REST API 默认开启spark.master.rest.enabled在 package.scala#L2284-L2287 定义版本号1.3.0自 4.1 起默认true设置false可恢复 4.1 之前行为。同时SparkSubmitArguments中useRest默认读取该键SparkSubmitArguments.scala#L103验证了spark-submit的 REST 提交路径与此开关的联动。RDD 检查点默认压缩spark.checkpoint.compressfalse可恢复旧行为package.scala#L1438。S3 Magic Committer 默认启用所有 S3 桶默认使用 Apache Hadoop Magic Committer设置spark.hadoop.fs.s3a.committer.magic.enabledfalse可恢复 4.0 之前行为。损坏文件忽略行为扩展文件读取过程中遇到java.lang.InternalError时若spark.sql.files.ignoreCorruptFiles或数据源选项ignoreCorruptFilestrue不再使任务失败。*.blacklist.*配置名废弃Spark 忽略*.blacklist.*替代配置名请改用自 Spark 3.1.0 起存在的对应标准配置名。LZF 压缩并行化LZF 压缩默认多线程并行spark.io.compression.lzf.parallel.enabled默认truepackage.scala#L2446-L2451设置false可恢复旧行为。原生 Netty IO 模式默认使用原生 Netty IO 模式设置spark.io.mode.defaultNIO可恢复 4.1 之前行为。Upgrading from Core 3.5 to 4.0事件日志、Shuffle 服务与 Kubernetes 行为变更Servlet API 与事件日志Servlet API 迁移内部引用从javax迁移到jakarta。这一点在HttpSecurityFilter中可直接印证——其导入了jakarta.servlet.*与jakarta.servlet.http.*HttpSecurityFilter.scala#L24-L25。事件日志增量滚动默认滚动归档事件日志spark.eventLog.rolling.enabledfalse恢复旧行为package.scala#L308。事件日志压缩默认压缩事件日志spark.eventLog.compressfalse恢复旧行为package.scala#L216-L220。Worker 目录清理Worker 周期性清理 worker 与已停止应用目录spark.worker.cleanup.enabledfalse恢复旧行为。Shuffle 服务存储后端spark.shuffle.service.db.backend默认值改为ROCKSDB设置LEVELDB可恢复 4.0 之前行为。Mesos 支持移除Spark 4.0 移除了对 Apache Mesos 资源管理器的支持。Kubernetes 相关变更执行器 Pod 批量分配默认从5调整为10spark.kubernetes.allocation.batch.size5可恢复旧行为。PVC 访问模式默认使用ReadWriteOncePod而非ReadWriteOncespark.kubernetes.legacy.useReadWriteOnceAccessModetrue可恢复旧行为。执行器 Pod 状态上报默认检查 Pod 的全部容器spark.kubernetes.executor.checkAllContainersfalse可恢复旧行为配置定义见 Config.scala#L883。Ivy、Shuffle 清理与日志/推测执行Ivy 目录隔离默认使用~/.ivy2.5.2作为 Ivy 用户目录以隔离 Apache Ivy 的兼容性问题spark.jars.ivy~/.ivy2恢复旧行为。外部 Shuffle 服务删除 Shuffle 块默认由外部 Shuffle 服务在 Shuffle 不再需要时为已释放执行器删除 Shuffle 块spark.shuffle.service.removeShufflefalse恢复旧行为。MDC 键名变更任务名 MDC 键从mdc.taskName改为task_namespark.log.legacyTaskNameMdc.enabledtrue继续使用旧键package.scala#L169。推测执行更保守默认spark.speculation.multiplier3、spark.speculation.quantile0.9配置定义见 package.scala#L2691 与 package.scala#L2697恢复旧行为需设置为1.5与0.75。配置键更名spark.shuffle.unsafe.file.output.buffer已废弃但可用改用spark.shuffle.localDisk.file.output.buffer。损坏文件异常语义收紧读文件遇到AccessControlException或BlockMissingException时即使设置了spark.sql.files.ignoreCorruptFiles或ignoreCorruptFilestrue任务仍会失败。Upgrading from Core 3.5.3 to 3.5.4 与 3.4→3.5异常语义与 YARN 配置迁移3.5.3 → 3.5.4读取文件时若遇到org.apache.hadoop.security.AccessControlException与org.apache.hadoop.hdfs.BlockMissingException异常会被抛出并使任务失败即使spark.files.ignoreCorruptFilestrue也无法忽略。3.4 → 3.5spark.yarn.executor.failuresValidityInterval废弃改用spark.executor.failuresValidityIntervalspark.yarn.max.executor.failures废弃改用spark.executor.maxNumFailures。Upgrading from Core 3.3 to 3.4PVC 归属、Shuffle 跟踪与下线流程Driver 持有 PVCDriver 拥有PersistentVolumeClaim并在其未被活跃执行器占用时尝试复用。spark.kubernetes.driver.ownPersistentVolumeClaim与spark.kubernetes.driver.reusePersistentVolumeClaim均默认trueConfig.scala#L104-L124恢复 3.4 之前行为需将两者均设为false。注意复用 PVC 依赖于ownPersistentVolumeClaimtrue且Terminating状态的 Pod 资源不可复用。无 Shuffle Service 的动态分配启用动态分配且无 Shuffle Service 时Driver 默认跟踪 Shuffle 数据spark.dynamicAllocation.shuffleTracking.enabledfalse恢复旧行为package.scala#L819。下线Decommission缓存块当spark.decommission.enabled与spark.storage.decommission.enabled均为 true 时默认尝试下线缓存的 RDD 与 Shuffle 块将spark.storage.decommission.rddBlocks.enabled与spark.storage.decommission.shuffleBlocks.enabled均设为false可恢复旧行为。History Server 混合存储spark.history.store.hybridStore.enabledtrue时默认使用 RocksDBspark.history.store.hybridStore.diskBackendLEVELDB可恢复旧行为。Upgrading from Core 3.1 to 3.3log4j 1.x 到 2.x 的重大迁移自 Spark 3.3 起Spark 将 log4j 依赖从 1.x 迁移到 2.x因为 log4j 1.x 已停止维护2015 年 8 月之后报告的漏洞不再修复。用户必须将原有 log4j properties 文件改写为 log4j2 语法XML、JSON、YAML 或 properties 格式。Spark 已将发行包中的conf/log4j.properties.template重写为conf/log4j2.properties.template。当前仓库 conf/log4j2.properties.template 即采用 log4j2 properties 格式且 log4j2.properties仓库根目录同样为 log4j2 语法是迁移后配置的直接参考样本。Upgrading from Core 3.1 to 3.2调度文件、事件日志与 K8s 服务清理调度分配文件支持 Hadoop FSspark.scheduler.allocation.file支持通过 Hadoop 文件系统读取远端文件无 scheme 时遵循 Hadoop 配置解析如需强制本地读取应显式指定file:///path/to/file。空输入切片spark.hadoopRDD.ignoreEmptySplits默认true不再为空输入切片创建空分区false可恢复旧行为。事件日志压缩编解码器spark.eventLog.compression.codec默认值改为zstd且不再回退到spark.io.compression.codecpackage.scala#L2462-L2469。缓存副本主动补全spark.storage.replication.proactive默认开启执行器失败丢失缓存 RDD 块副本时主动补全package.scala#L539。拼写更正spark.launcher.childConectionTimeout拼写错误废弃改用spark.launcher.childConnectionTimeout。Mesos 废弃Mesos 支持被标记为废弃将在未来版本移除。K8s Driver Service 删除应用正常终止时删除 K8s Driver Service 资源spark.kubernetes.driver.service.deleteOnTerminationfalse恢复旧行为。Upgrading from Core 3.0 to 3.1执行器内 SparkContext 与 YARN 类路径执行器内禁止创建 SparkContextSpark 3.0 及以下可在执行器中创建SparkContext自 3.1 起会抛出异常如需允许设置spark.executor.allowSparkContext。YARN Hadoop 类路径传播内置 Hadoop 的 Spark 发行版不再自动传播yarn.application.classpath与mapreduce.application.classpath以避免集群侧传递依赖如 Guava、Jackson带来的冲突spark.yarn.populateHadoopClasspathtrue可恢复旧行为。Upgrading from Core 2.4 to 3.0API 移除与协议升级插件接口替换org.apache.spark.ExecutorPlugin及其相关配置被org.apache.spark.api.plugin.SparkPlugin取代旧接口插件必须改造以继承新接口详见 docs/monitoring.md。移除的废弃 APITaskContext.isRunningLocally已移除本地执行早已移除该方法恒返回falseShuffleWriteMetrics中的shuffleBytesWritten、shuffleWriteTime、shuffleRecordsWritten分别改用bytesWritten、writeTime、recordsWrittenAccumulableInfo.apply已移除禁止创建AccumulableInfo累加器 v1 API 已移除请改用 v2 API。事件日志编码统一为 UTF-8Driver JVM 默认字符集写入改为 UTF-8History Server 以 UTF-8 重放若旧日志编码不兼容需使用 Spark 2.x 的 History Server 读取。Shuffle 拉取协议升级引入新的 Shuffle 块拉取协议运行 Spark 3.0 应用时建议同步升级外部 Shuffle 服务旧服务可通过spark.shuffle.useOldFetchProtocoltrue兼容package.scala#L2043否则可能报IllegalArgumentException: Unexpected message type: number。Standalone 模式调整SPARK_WORKER_INSTANCES废弃推荐单 Worker 多执行器、每节点单 Worker的部署方式取代单节点多 Worker、每 Worker 单执行器。附迁移检查清单升级 Spark Core 时建议按以下顺序自查先阅读 docs/core-migration-guide.md 中与目标版本对应的迁移段逐条核对默认行为变化在 conf/spark-defaults.conf.template 中显式记录需要回退的配置键如spark.rdd.compressfalse避免隐式依赖旧行为核对源码中的配置默认值Core 配置集中定义于 core/src/main/scala/org/apache/spark/internal/config/package.scalaKubernetes 配置集中于 resource-managers/kubernetes/core/src/main/scala/org/apache/spark/deploy/k8s/Config.scalaUI 安全行为见 core/src/main/scala/org/apache/spark/ui/HttpSecurityFilter.scala若使用 log4j1 配置文件务必按 log4j2 语法迁移参考 conf/log4j2.properties.template涉及 YARN 与 Kubernetes 部署时重点检查类路径传播、PVC 归属、NetworkPolicy 与安全上下文相关配置。【免费下载链接】sparkApache Spark - A unified analytics engine for large-scale data processing项目地址: https://gitcode.com/gh_mirrors/sp/spark创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价