Spark2.4.x与Spark3.3.x版本在通用队列的差异对比
DLI整理了Spark2.4.x与Spark3.3.x版本在通用队列的差异,便于您了解Spark版本升级后通用队列上运行的作业在适配新版本引擎时的影响。
log4j依赖从1.x版本修改为2.x版本
- 说明:
log4j依赖从1.x版本修改为2.x版本
- Spark2.4.x:log4j依赖1.x版本(社区不再支持)。
- Spark3.3.x:log4j依赖2.x版本。
- 升级引擎版本后是否对作业有影响:
有影响
Spark3.3.x不支持v1表
- 说明:
Spark2.4.x支持datasourcev1、datasourcev2表。Spark3.3.x不支持v1表。
具体说明请参考DLI datasourceV1表和datasourceV2表。
- Spark2.4.x:支持datasourcev1、datasourcev2表。
- Spark3.3.x:不支持支持datasourcev1表。
- 升级引擎版本后是否对作业有影响:
有影响,建议在Spark2.4.5版本整改到v2表后再升级Spark3.3.1,具体操作指导可以参考DLI datasourceV1表和datasourceV2表的中的示例。
默认情况下空的input split不创建partition
- 说明:
- Spark2.4.x:默认情况下空的input split将创建partition。
- Spark3.3.x:默认情况下空的input split不创建partition。
Spark3.3.x时spark.hadoopRDD.ignoreEmptySplits=true。
- 升级引擎版本后是否对作业有影响:
有影响,需要判断是否使用分区名做业务判断。
eventlog的压缩格式设置为zstd
- 说明:
Spark3.3.x版本中,spark.eventLog.compression.codec的默认值被设置为zstd,Spark在压缩事件日志时将不再支持使用spark.io.compression.codec的参数值。
- Spark2.4.x:使用spark.io.compression.codec的参数值作为eventlog的压缩格式。
- Spark3.3.x:spark.eventLog.compression.codec默认设置为zstd。
- 升级引擎版本后是否对作业有影响:
有影响,eventlog的压缩格式发生变化。
spark.launcher.childConectionTimeout修改
- 说明:
- Spark2.4.x:配置名为spark.launcher.childConectionTimeout
- Spark3.3.x:配置名修改为spark.launcher.childConnectionTimeout
- 升级引擎版本后是否对作业有影响:
有影响,配置参数名称变化。
Spark3.3.x不再支持将Apache Mesos作为资源管理器
- 说明:
- Spark2.4.x:Spark 2.4.x版本中使用Apache Mesos作为资源管理器。
- Spark3.3.x:Spark3.3.x不再支持将Apache Mesos作为资源管理器。
- 升级引擎版本后是否对作业有影响:
功能增强,Spark 2.4.x版本中使用Mesos作为资源管理器,升级到Spark 3.3.x后,你需要考虑切换到其他资源管理器。
Spark3.3.x会在应用程序自行终止时删除K8s driver
- 说明:Spark3.3.x会在应用程序自行终止时删除K8s driver。
- 升级引擎版本后是否对作业有影响:
功能增强,升级到Spark 3.3.x后,对于之前依赖于Kubernetes作为资源管理器的作业会有影响。Spark 3.3.x在应用程序终止时会自动删除driver pod可能会影响到作业的资源管理和清理流程。
Spark3.3.x支持自定义k8s的调度器
- 说明:
- Spark2.4.x:不支持使用指定Kubernetes调度器来管理Spark作业的资源分配和调度。
- Spark3.3.x:Spark3.3.x支持自定义k8s的调度器。
- 升级引擎版本后是否对作业有影响:
功能增强,支持自定义调度器管理资源的分配和调度。
Spark将不可为null的模式转换为可空
- 说明:
在Spark 2.4.x版本中,当用户指定的schema包含不可为空的字段时,Spark会将这些不可为null的模式转换为可空的。
但是在Spark 3.3.x版本中,Spark尊重用户指定的schema中的nullability,即如果字段被定义为不可为空,Spark会保持该配置要求,不会自动转换为可空的字段。
- Spark2.4.x:在Spark 2.4.x版本中,当用户指定的schema包含不可为空的字段时,Spark会将这些不可为null的模式转换为可空的。
- Spark3.3.x:Spark不会自动转换为可空的字段。
如果希望在Spark 3.3.x版本中恢复到Spark 2.4.x版本的执行方式,您可以通过将 spark.sql.legacy.respectNullabilityInTextDatasetConversion设置为true来实现。
- 升级引擎版本后是否对作业有影响:
有影响。
- 示例代码:
执行sql:
spark.read.schema(StructType( StructField("f1", LongType, nullable = false) :: StructField("f2", LongType, nullable = false) :: Nil) ).option("mode", "DROPMALFORMED").json(Seq("""{"f1": 1}""").toDS).show(false);
- Spark2.4.5
|f1 |f2 | +---+---+ |1 |0 |
- Spark3.3.1
|f1 |f2 | +---+----+ |1 |null|
- Spark2.4.5
Spark scala版本变更
- 说明:
Spark scala版本变更。
- Spark2.4.x:Spark scala版本为2.11。
- Spark3.3.x:Spark scala版本升级到2.12。
- 升级引擎版本后是否对作业有影响:
有影响,jar需要升级scala版本编译。
PySpark支持python版本变更
- 说明:
PySpark支持python版本变更。
- Spark2.4.x:PySpark支持python版本范围2.6+版本到3.7+版本。
- Spark3.3.x:PySpark支持Python版本范围3.6及以上版本。
- 升级引擎版本后是否对作业有影响:
依赖版本变化,有影响,需要排查是否涉及。
PySpark-pandas支持版本变更
- 说明:
- Spark2.4.x:在Spark 2.4.x版本中,PySpark并没有要求指定Pandas的版本。
- Spark3.3.x:从Spark 3.3.x版本开始,PySpark需要0.23.2或更高版本的pandas才能使用pandas相关功能,如toPandas、 toPandas, createDataFrame from pandas DataFrame等。
- 升级引擎版本后是否对作业有影响:
依赖版本变化,有影响,需要排查是否涉及。
PySpark-PyArrow支持版本变更
- 说明:
- Spark2.4.x:在Spark 2.4.x版本中,PySpark并没有要求指定PyArrow的版本。
- Spark3.3.x:从Spark 3.3.x版本开始,PySpark需要0.12.1或更高版本的PyArrow才能使用PyArrow相关功能,如Pandas_udf、toPandas等。
- 升级引擎版本后是否对作业有影响:
依赖版本变化,有影响,需要排查是否涉及。
以command命名DataFrameWriter触发的查询
在Spark 3.2.x版本中,当DataFrameWriter触发的查询执行被发送给QueryExecutionListener时,这些查询的名称总是被设置为command。而在Spark 3.1及更早版本中,这些查询的名称可能是save、insertInto或saveAsTable之一,这取决于具体的操作。
- 说明:
DataFrameWriter触发的查询执行在发送到QueryExecutionListener时,始终以command命名
- Spark2.4.x:名称为save、insertInto、saveAsTable中的一个
- Spark3.3.x:command命名
- 升级引擎版本后是否对作业有影响:
有影响