将 AWS Glue for Spark 作业迁移到 AWS Glue 版本 6.0
本主题介绍 AWS Glue 版本 5.1 和 6.0 之间的变化,以便您将 Spark 应用程序和 ETL 作业迁移到 AWS Glue 6.0。还介绍了 AWS Glue 6.0 中的功能以及使用它的优点。
要将此功能与 AWS Glue ETL 任务结合使用,请在创建任务时为 Glue version 选择 6.0。
主题
新功能
此部分介绍 AWS Glue 版本 6.0 的新功能和优势。
-
Apache Spark 从 AWS Glue 5.1 中的 3.5.6 升级到 AWS Glue 6.0 中的 4.1.1。
-
Scala 从 2.12.18 升级到 2.13.17。
-
Python 从 3.11 升级到 3.13。
-
开放表格式(OTF)已更新至 Hudi 1.1.1、Iceberg 1.11.0 和 Delta Lake 4.2.0。
-
Iceberg 格式版本 3:扩展数据类型和现有元数据结构,以添加新功能,包括:
支持变体分解的 VARIANT 数据类型,可简化半结构化数据管理并加快读取速度。
纳秒精度时间戳。
地理空间数据类型(Geometry 和 Geography)。
-
Spark 声明式管道(SDP):一种新的声明式框架,用于通过 SQL 或 DataFrame API 定义端到端数据管道,支持流式传输表和实体化视图。有关更多信息,请参阅 Spark 声明式管道。
-
用于交互式会话的 Spark Connect:通过 Spark Connect 协议实现与 AWS Glue 交互式会话的瘦客户端连接,支持远程开发工作流。
-
Arrow 原生 Python UDF/UDTF:通过原生使用 Apache Arrow 列式格式提升 Python 用户自定义函数的性能。
-
客户自主管理或服务生成的 Python 虚拟环境(
--python-virtual-env):您可以构建并提供自己的 Python venv,AWS Glue 在运行时将其附加到 Spark 驱动程序和执行程序上,从而提供对依赖项管理的完全控制。将现有作业迁移到 AWS Glue 6.0 后,AWS Glue 会在需要时自动生成此虚拟环境。 -
流式传输增强:实时模式,用于具有毫秒级延迟的无状态流式传输。有关更多信息,请参阅 为流式传输作业启用实时模式。
-
连接器升级:更新了 Amazon Redshift、MongoDB、Snowflake 和其他连接器。有关完整版本的详细信息,请参阅 附录 C:连接器升级。
已知问题和限制
请注意以下已知问题和限制:
-
在 Spark 4.1 中,ANSI 模式默认处于启用状态。以往发生溢出时返回 NULL 的操作(例如,整数算术、强制转换运算)现在会抛出异常。设置
spark.sql.ansi.enabled=false可恢复以前的行为。 -
Spark 声明式管道(SDP)是一项新功能,对某些 SQL 结构的支持有限。有关当前限制,请参阅 Spark 声明式管道 文档。
-
Athena SQL 无法读取在 AWS Glue 6.0 中创建的 Iceberg v3 表(错误:
Cannot read unsupported version 3)。使用 Iceberg v2 实现与 Athena 的跨引擎兼容。 -
Python 3.13 移除了几个已弃用的模块,并更改了某些标准库函数的行为。请查看 Python 3.13 迁移指南以了解兼容性。
-
适用于 Java 的 AWS SDK 2.x 与
--user-jars-first的兼容性:AWS Glue 6.0 包含适用于 Java 的 AWS SDK 2.x 版本 2.44.6。如果您将--user-jars-first作业参数与捆绑了旧版本适用于 Java 的 AWS SDK 2.x 的自定义 JAR 一起使用,则您的作业可能会因java.lang.NoSuchFieldError或类似错误而失败。当您的自定义 JAR 中捆绑的 SDK 缺少 AWS Glue 运行时所依赖的类、字段或方法时,将会发生这些故障。为避免出现此问题,请确保您通过--user-jars-first提供的任何自定义 JAR 均使用适用于 Java 的 AWS SDK 2.x 版本 2.44.6 或更高版本。
重大更改
请注意以下重大更改:
-
EMRFS 已被移除。S3A 是 AWS Glue 6.0 中唯一的 S3 文件系统。
com.amazon.ws.emr.hadoop.fs.EmrFileSystem类不再可用。使用s3://路径的作业会自动使用 S3A。如果您之前设置了特定于 EMRFS 的配置(例如fs.s3.consistent.*),请将其移除。 -
适用于 Java 的 AWS SDK v1 已被移除。仅 AWS SDK v2(2.44.6)可用。导入
com.amazonaws.services.*软件包的作业必须迁移到software.amazon.awssdk.services.*。 -
Scala 已从 2.12 升级到 2.13。针对 Scala 2.12 编译的自定义 JAR 将无法正常工作。请针对 Scala 2.13.17 重新编译。主要变更:
JavaConversions已移除(请使用CollectionConverters)、MutableList已移除(请使用ListBuffer),并行集合需要单独导入。 -
Spark 4.1 API 变更:
SQLContext已移除:请直接使用SparkSession。默认情况下启用 ANSI 模式:隐式类型转换和溢出的行为将有所不同。
移除了几个已弃用的 API。请参阅 Apache Spark 网站上的 Spark 4.1 迁移指南
。
-
CreateSession API 验证:对交互式会话的会话参数进行额外验证。从前以静默方式接受的无效配置现在可能会返回错误。
-
getResolvedOptions行为更改:默认情况下,参数前缀匹配处于禁用状态(allow_abbrev=False)。请使用完整的参数名称,或将allow_abbrev=True传递给getResolvedOptions()以恢复旧行为。
用于迁移到 AWS Glue 6.0 的操作
对于现有任务,请将 Glue version 从以前的版本更改为任务配置中的 Glue 6.0。
-
在 AWS Glue Studio 中,为
Glue version选择Glue 6.0 - Supports Spark 4.1.1, Scala 2, Python 3。 -
在 API 中,在 UpdateJob API 操作的
GlueVersion参数中选择6.0。
对于新任务,请在创建任务时选择 Glue 6.0。
-
在控制台中,为
Glue version选择Spark 4.1.1, Python 3 (Glue Version 6.0) or Spark 4.1.1, Scala 2 (Glue Version 6.0)。 -
在 AWS Glue Studio 中,为
Glue version选择Glue 6.0 - Supports Spark 4.1.1, Scala 2, Python 3。 -
在 API 中,在 CreateJob API 操作的
GlueVersion参数中选择6.0。
为了帮助迁移作业,您可以使用适用于 Apache Spark 的生成式人工智能升级,将您的 AWS Glue ETL 作业从旧版 AWS Glue(2.0 及更高版本)升级到最新的 AWS Glue 版本。
问题排查
您可以使用 Spark 故障排除代理对 AWS Glue ETL 作业进行故障排除。
迁移核对清单
查看此核对清单以进行迁移:
-
[Scala] 针对 Scala 2.13.17 重新编译自定义 JAR。将
JavaConversions替换为CollectionConverters。 -
[Python] 更新代码以兼容 Python 3.13。移除已弃用模块的使用(例如,
imp、cgi、cgitb)。 -
[Python] 将 boto3 引用从 1.40 更新到 1.42。
-
[Spark SQL] 查看查询以了解 ANSI 模式的影响。必要时,请添加
spark.sql.ansi.enabled=false。 -
[SDK] 将所有 AWS SDK v1 导入(
com.amazonaws.*)替换为 SDK v2(software.amazon.awssdk.*)。 -
[S3] 移除特定于 EMRFS 的配置。S3A 现在是默认且唯一的 S3 连接器。
-
[依赖关系] 将
--extra-jars更新为针对 Scala 2.13 和 Spark 4.1 编译的版本。
从 AWS Glue 5.1 迁移到 AWS Glue 6.0
所有现有任务参数和 AWS Glue 5.1 中存在的主要功能将存在于 AWS Glue 6.0。迁移时,请注意以下更改:
-
S3 文件系统:EMRFS 已不再可用。S3A 是唯一的 S3 连接器。如果您之前设置过
spark.hadoop.fs.s3a.endpoint.region,请继续使用。如果未设置,请确保您的 VPC 端点或网络配置允许 S3A 解析正确的区域。 -
Scala 二进制兼容性:AWS Glue 6.0 使用 Scala 2.13。任何使用 Scala 2.12 编译的
--extra-jars都会失败,并显示NoSuchMethodError或ClassNotFoundException。重新编译所有自定义 Scala/Java JAR。 -
Spark SQL 行为变更:
默认情况下,ANSI 模式处于开启状态。整数溢出、无效的强制转换和数组索引越界会引发异常,而不是返回 NULL。
spark.sql.legacy.timeParserPolicy默认值已更改。日期/时间解析的行为可能会有所不同。SQL 中的隐式字符串到数字的转换在 ANSI 模式下可能会失败。
-
Python 版本:Python 3.13 为运行时环境。
--additional-python-modules功能可以继续工作,但已被弃用。考虑迁移到--python-virtual-env,以实现完全的依赖项控制。 -
AWS SDK:仅提供 SDK v2。如果您的脚本使用 boto3(Python),则无需进行任何更改——boto3 可以继续使用。对于直接使用 AWS SDK 的 Scala/Java 作业,请迁移到 v2 API。
请参阅 Spark 迁移文档:
-
Apache Spark 网站上的迁移指南:Spark Core
-
Apache Spark 网站上的迁移指南:SQL、数据集和 DataFrame
-
Apache Spark 网站上的迁移指南:Structured Streaming
-
Apache Spark 网站上的升级 PySpark
从旧的 AWS Glue 版本迁移到 AWS Glue 6.0
-
有关从 AWS Glue 5.0 迁移到 AWS Glue 5.1 的迁移步骤,请参阅 从 AWS Glue 5.0 迁移到 AWS Glue 5.1。
-
有关从 AWS Glue 4.0 迁移到 AWS Glue 5.0 的迁移步骤,请参阅 从 AWS Glue 4.0 迁移到 AWS Glue 5.0。
-
有关从 AWS Glue 3.0 迁移到 AWS Glue 5.0 的迁移步骤,请参阅 从 AWS Glue 3.0 迁移到 AWS Glue 5.0。
-
有关从 AWS Glue 2.0 迁移到 AWS Glue 5.0 的迁移步骤,请参阅 从 AWS Glue 2.0 迁移到 AWS Glue 5.0。
-
完成上述步骤后,请按照 从 AWS Glue 5.1 迁移到 AWS Glue 6.0 完成向 AWS Glue 6.0 的迁移。
AWS Glue 6.0 版的连接器和 JDBC 驱动程序迁移
有关已升级的 JDBC 和数据湖连接器的版本,请参阅:
以下更改适用于 附录 D:开放表格式升级 中列出的针对 AWS Glue 6.0的 OTF 版本升级。
Apache Iceberg
注意以下更改:
Iceberg 已升级到 1.11.0,全面支持 Apache Iceberg 第 3 版规范。
带有变体分解功能的 VARIANT 数据类型,可优化半结构化数据查询。
纳秒精度时间戳。
地理空间数据类型(Geometry 和 Geography)。
自 AWS Glue 5.1 起,AWS Glue ETL 已支持以下 Iceberg 功能:删除向量(使用存储在 Puffin 文件中的 Roaring Bitmap 进行读取时合并)以及通过 first-row-id 元数据进行行谱系跟踪。
Apache Hudi
注意以下更改:
Hudi 已升级到 1.1.1。
继续支持对 AWS Lake Formation 注册表的 FTA 读写访问。
Delta Lake
注意以下更改:
Delta Lake 已升级到 4.2.0。
继续支持对 AWS Lake Formation 注册表的 FTA 读写访问。
已知限制条件
以下限制适用于 AWS Glue 6.0:
-
不支持 Iceberg 原生表加密密钥。
-
不支持 Iceberg 多参数转换。
-
新的 Iceberg v3 数据类型仅支持 Spark DataFrames。这些功能不适用于 DynamicFrames。
-
AWS Glue Studio 中的可视化 ETL 不支持新的 Iceberg v3 数据类型。如果您希望在可视化 ETL 中使用这些新功能,建议将 ETL 作业迁移到 Amazon SageMaker 融通式合作开发工作室。
-
VARIANT 列不支持精细访问控制(FGAC)。
-
Athena SQL 无法读取使用
'format-version'='3'创建的 Iceberg 表(错误:Cannot read unsupported version 3)。使用 Iceberg v2 实现与 Athena 的跨引擎兼容。
附录 A:显著依赖项升级
以下是依赖项升级:
| 依赖关系 | AWS Glue 6.0 中的版本 | AWS Glue 5.1 中的版本 | AWS Glue 5.0 中的版本 | AWS Glue 4.0 中的版本 |
|---|---|---|---|---|
| Java | 17 | 17 | 17 | 8 |
| Spark | 4.1.1 | 3.5.6 | 3.5.4 | 3.3.0-amzn-1 |
| Hadoop | 3.4.2 | 3.4.1 | 3.4.1 | 3.3.3-amzn-0 |
| Scala | 2.13.17 | 2.12.18 | 2.12.18 | 2.12 |
| Jackson | 2.20.0 | 2.15.2 | 2.15.2 | 2.12 |
| Hive | 2.3.10-amzn-1 | 2.3.9-amzn-4 | 2.3.9-amzn-4 | 2.3.9-amzn-2 |
| Arrow | 18.3.0 | 12.0.1 | 12.0.1 | 7.0.0 |
| AWS Glue 数据目录客户端 | 4.11.0 | 4.9.0 | 4.5.0 | 3.7.0 |
| AWS SDK for Java | 2.44.6(仅限 v2) | 2.35.5 | 2.29.52 | 1.12 |
| Python | 3.13 | 3.11 | 3.11 | 3.10 |
| Boto3 | 1.42.84 | 1.40.61 | 1.34.131 | 1.26 |
| Json4s | 3.7.0-M11 | 3.7.0-M11 | 3.7.0-M11 | 3.7.0-M11 |
| EMR DynamoDB 连接器 | 6.1.0 | 5.7.0 | 5.6.0 | 4.16.0 |
| Netty | 4.2.7 | 不适用 | 不适用 | 不适用 |
| Parquet | 1.16.0 | 不适用 | 不适用 | 不适用 |
| NumPy | 2.4.4 | 不适用 | 不适用 | 不适用 |
| Pandas | 2.3.3 | 不适用 | 不适用 | 不适用 |
附录 B:JDBC 驱动程序升级
以下是 JDBC 驱动程序升级:
| 驱动程序 | AWS Glue 6.0 中的 JDBC 驱动程序版本 | AWS Glue 5.1 中的 JDBC 驱动程序版本 | AWS Glue 5.0 中的 JDBC 驱动程序版本 |
|---|---|---|---|
| MySQL | 8.0.33 | 8.0.33 | 8.0.33 |
| Microsoft SQL Server | 10.2.0 | 10.2.0 | 10.2.0 |
| Oracle 数据库 | 23.4.0.24.05 | 23.3.0.23.09 | 23.3.0.23.09 |
| PostgreSQL | 42.7.3 | 42.7.3 | 42.7.3 |
| Amazon Redshift | redshift-jdbc42-2.2.7 |
redshift-jdbc42-2.1.0.29 |
redshift-jdbc42-2.1.0.29 |
| MariaDB | 3.5.7 | 不适用 | 不适用 |
附录 C:连接器升级
以下是连接器升级:
| Connector | AWS Glue 6.0 中的版本 | AWS Glue 5.1 中的版本 | AWS Glue 5.0 中的版本 |
|---|---|---|---|
| Spark Redshift | 6.7.0 | 6.4.2 | 6.4.0 |
| Spark SQL Kinesis | 2.1.0 | 不适用 | 不适用 |
| MongoDB | 11.0.1 | 10.3.0 | 10.3.0 |
| Snowflake | 3.17.0 | 3.1.1 | 3.0.0 |
| OpenSearch | 2.0.0 | 1.2.0 | 1.2.0 |
| EMR DynamoDB 连接器 | 6.1.0 | 5.7.0 | 5.6.0 |
附录 D:开放表格式升级
下面是开放表格式升级:
| OTF | AWS Glue 6.0 中的版本 | AWS Glue 5.1 中的版本 | AWS Glue 5.0 中的版本 | AWS Glue 4.0 中的版本 |
|---|---|---|---|---|
| Hudi | 1.1.1 | 1.0.2 | 0.15.0 | 0.12.1 |
| Delta Lake | 4.2.0 | 3.3.2 | 3.3.0 | 2.1.0 |
| Iceberg | 1.11.0 | 1.10.0 | 1.7.1 | 1.0.0 |