

# 将 Amazon Glue 的 Spark 作业迁移到 Amazon Glue 6.0 版本
<a name="migrating-version-60"></a>

本主题介绍 Amazon Glue 版本 5.1 和 6.0 之间的变化，以便您将 Spark 应用程序和 ETL 作业迁移到 Amazon Glue 6.0。还介绍了 Amazon Glue 6.0 中的功能以及使用该版本的优点。

要对您的 Amazon Glue ETL 作业使用此功能，请在创建作业时为 `Glue version` 选择 **6.0**。

**Topics**
+ [新功能](#migrating-version-60-features)
+ [用于迁移到 Amazon Glue 6.0 的操作](#migrating-version-60-actions)
+ [迁移核对清单](#migrating-version-60-checklist)
+ [从 Amazon Glue 5.1 迁移到 Amazon Glue 6.0](#migrating-version-60-from-51)
+ [从旧的 Amazon Glue 版本迁移到 Amazon Glue 6.0](#migrating-older-versions-to-60)
+ [Amazon Glue 6.0 版的连接器和 JDBC 驱动程序迁移](#migrating-version-60-connector-driver-migration)
+ [已知限制条件](#migrating-version-60-known-limitations)
+ [附录 A：显著依赖项升级](#migrating-version-60-appendix-dependencies)
+ [附录 B：JDBC 驱动程序升级](#migrating-version-60-appendix-jdbc-driver)
+ [附录 C：连接器升级](#migrating-version-60-appendix-connector)
+ [附录 D：开放表格式升级](#migrating-version-60-appendix-open-table-formats)

## 新功能
<a name="migrating-version-60-features"></a>

此部分介绍 Amazon Glue 版本 6.0 的新功能和优势。
+ Apache Spark 从 Amazon Glue 5.1 中的 3.5.6 升级到 Amazon 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）。
**升级到 Iceberg v3 是一项不可逆的变更**  
一旦将 Iceberg 表升级至格式版本 3，就无法再降级回版本 2——Iceberg 会拒绝 `ALTER TABLE ... SET TBLPROPERTIES('format-version'='2')` 操作。如果您使用的其他服务不支持 Iceberg v3，请将该表保留为 Iceberg v2 表，不要将其升级到 v3。
+ **Spark 声明式管道（SDP）**——一种新的声明式框架，用于使用 SQL 或 DataFrame API 定义端到端数据管道，并支持流式表和实体化视图。有关更多信息，请参阅 [Spark 声明式管道](spark-declarative-pipelines.md)。
+ **用于交互式会话的 Spark Connect**：通过 Spark Connect 协议实现与 Amazon Glue 交互式会话的瘦客户端连接，支持远程开发工作流。
+ **Arrow 原生 Python UDF/UDTF**：通过原生使用 Apache Arrow 列式格式提升 Python 用户自定义函数的性能。
+ **客户自主管理或服务生成的 Python 虚拟环境**（`--python-virtual-env`）：您可以构建并提供自己的 Python venv，Amazon Glue 在运行时将其附加到 Spark 驱动程序和执行程序上，从而提供对依赖项管理的完全控制。将现有作业迁移到 Amazon Glue 6.0 后，Amazon Glue 会在需要时自动生成此虚拟环境。有关更多信息，请参阅 [在 Amazon Glue 中使用 Python 虚拟环境](aws-glue-programming-python-virtual-environments.md)。
+ **流式传输增强**：实时模式，用于具有毫秒级延迟的无状态流式传输。有关更多信息，请参阅 [为流式传输作业启用实时模式](streaming-chapter.md#glue-streaming-real-time-mode)。
+ **连接器升级**：更新了 Amazon Redshift、MongoDB、Snowflake 和其他连接器。有关完整版本的详细信息，请参阅 [附录 C：连接器升级](#migrating-version-60-appendix-connector)。

**已知问题和限制**  
请注意以下已知问题和限制：
+ 在 Spark 4.1 中，**ANSI 模式默认处于启用状态**。以往发生溢出时返回 NULL 的操作（例如，整数算术、强制转换运算）现在会抛出异常。设置 `spark.sql.ansi.enabled=false` 可恢复以前的行为。
+ **Spark 声明式管道（SDP）**是一项新功能，对某些 SQL 结构的支持有限。有关当前限制，请参阅 [Spark 声明式管道](spark-declarative-pipelines.md) 文档。
+ Athena SQL 无法读取在 Amazon Glue 6.0 中创建的 **Iceberg v3 表**（错误：`Cannot read unsupported version 3`）。使用 Iceberg v2 实现与 Athena 的跨引擎兼容。
+ **Python 3.13** 移除了几个已弃用的模块，并更改了某些标准库函数的行为。请查看 Python 3.13 迁移指南以了解兼容性。
+ **适用于 Java 的 Amazon SDK 2.x 与 `--user-jars-first` 的兼容性**：Amazon Glue 6.0 包含适用于 Java 的 Amazon SDK 2.x 版本 2.44.6。如果您将 `--user-jars-first` 作业参数与捆绑了旧版本适用于 Java 的 Amazon SDK 2.x 的自定义 JAR 一起使用，则您的作业可能会因 `java.lang.NoSuchFieldError` 或类似错误而失败。当您的自定义 JAR 中捆绑的 SDK 缺少 Amazon Glue 运行时所依赖的类、字段或方法时，将会发生这些故障。为避免出现此问题，请确保您通过 `--user-jars-first` 提供的任何自定义 JAR 均使用适用于 Java 的 Amazon SDK 2.x 版本 2.44.6 或更高版本。

**重大更改**  
请注意以下重大更改：
+ **EMRFS 已被移除。**S3A 是 Amazon Glue 6.0 中唯一的 S3 文件系统。`com.amazon.ws.emr.hadoop.fs.EmrFileSystem` 类不再可用。使用 `s3://` 路径的作业会自动使用 S3A。如果您之前设置了特定于 EMRFS 的配置（例如 `fs.s3.consistent.*`），请将其移除。
+ **适用于 Java 的 Amazon SDK v1 已被移除。**仅 Amazon 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 迁移指南](https://spark.apache.org/docs/4.1.1/migration-guide.html)。
+ **CreateSession API 验证**：对交互式会话的会话参数进行额外验证。从前以静默方式接受的无效配置现在可能会返回错误。
+ **`getResolvedOptions` 行为更改**：默认情况下，参数前缀匹配处于禁用状态（`allow_abbrev=False`）。请使用完整的参数名称，或将 `allow_abbrev=True` 传递给 `getResolvedOptions()` 以恢复旧行为。

## 用于迁移到 Amazon Glue 6.0 的操作
<a name="migrating-version-60-actions"></a>

对于现有作业，请在作业配置中将 `Glue version` 从先前版本更改为 `Glue 6.0`。
+ 在 Amazon Glue Studio 中，为 `Glue version` 选择 `Glue 6.0 - Supports Spark 4.1.1, Scala 2, Python 3`。
+ 在 API 中，在 [UpdateJob](https://docs.amazonaws.cn/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-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)`。
+ 在 Amazon Glue Studio 中，为 `Glue version` 选择 `Glue 6.0 - Supports Spark 4.1.1, Scala 2, Python 3`。
+ 在 API 中，在 [CreateJob](https://docs.amazonaws.cn/glue/latest/dg/aws-glue-api-jobs-job.html#aws-glue-api-jobs-job-CreateJob) API 操作的 `GlueVersion` 参数中选择 **6.0**。

为了帮助迁移作业，您可以使用[适用于 Apache Spark 的生成式人工智能升级](https://docs.amazonaws.cn/glue/latest/dg/upgrade-analysis.html)，将您的 Amazon Glue ETL 作业从旧版 Amazon Glue（2.0 及更高版本）升级到最新的 Amazon Glue 版本。

**注意**  
您可以使用 [Spark 故障排除代理](https://docs.amazonaws.cn/emr/latest/ReleaseGuide/spark-troubleshoot.html)对 Amazon Glue ETL 作业进行故障排除。

## 迁移核对清单
<a name="migrating-version-60-checklist"></a>

查看此核对清单以进行迁移：
+ [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] 将所有 Amazon SDK v1 导入（`com.amazonaws.*`）替换为 SDK v2（`software.amazon.awssdk.*`）。
+ [S3] 移除特定于 EMRFS 的配置。S3A 现在是默认且唯一的 S3 连接器。
+ [依赖关系] 将 `--extra-jars` 更新为针对 Scala 2.13 和 Spark 4.1 编译的版本。

## 从 Amazon Glue 5.1 迁移到 Amazon Glue 6.0
<a name="migrating-version-60-from-51"></a>

所有现有作业参数和 Amazon Glue 5.1 中存在的主要功能将存在于 Amazon Glue 6.0。迁移时，请注意以下更改：
+ **S3 文件系统：**EMRFS 已不再可用。S3A 是唯一的 S3 连接器。如果您之前设置过 `spark.hadoop.fs.s3a.endpoint.region`，请继续使用。如果未设置，请确保您的 VPC 端点或网络配置允许 S3A 解析正确的区域。
+ **Scala 二进制兼容性：**Amazon 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`，以实现完全的依赖项控制。有关迁移步骤，请参阅 [在 Amazon Glue 中使用 Python 虚拟环境](aws-glue-programming-python-virtual-environments.md)。
+ **Amazon SDK：**仅提供 SDK v2。如果您的脚本使用 boto3（Python），则无需进行任何更改——boto3 可以继续使用。对于直接使用 Amazon SDK 的 Scala/Java 作业，请迁移到 v2 API。

请参阅 Spark 迁移文档：
+ Apache Spark 网站上的[迁移指南：Spark Core](https://spark.apache.org/docs/4.1.1/core-migration-guide.html)
+ Apache Spark 网站上的[迁移指南：SQL、数据集和 DataFrame](https://spark.apache.org/docs/4.1.1/sql-migration-guide.html)
+ Apache Spark 网站上的[迁移指南：Structured Streaming](https://spark.apache.org/docs/4.1.1/ss-migration-guide.html)
+ Apache Spark 网站上的[升级 PySpark](https://spark.apache.org/docs/4.1.1/api/python/migration_guide/pyspark_upgrade.html)

## 从旧的 Amazon Glue 版本迁移到 Amazon Glue 6.0
<a name="migrating-older-versions-to-60"></a>
+ 有关从 Amazon Glue 5.0 迁移到 Amazon Glue 5.1 的迁移步骤，请参阅 [从 Amazon Glue 5.0 迁移到 Amazon Glue 5.1](migrating-version-51.md#migrating-version-51-from-50)。
+ 有关从 Amazon Glue 4.0 迁移到 Amazon Glue 5.0 的迁移步骤，请参阅 [从 Amazon Glue 4.0 迁移到 Amazon Glue 5.0](migrating-version-50.md#migrating-version-50-from-40)。
+ 有关从 Amazon Glue 3.0 迁移到 Amazon Glue 5.0 的迁移步骤，请参阅 [从 Amazon Glue 3.0 迁移到 Amazon Glue 5.0](migrating-version-50.md#migrating-version-50-from-30)。
+ 有关从 Amazon Glue 2.0 迁移到 Amazon Glue 5.0 的迁移步骤，请参阅 [从 Amazon Glue 2.0 迁移到 Amazon Glue 5.0](migrating-version-50.md#migrating-version-50-from-20)。
+ 完成上述步骤后，请按照 [从 Amazon Glue 5.1 迁移到 Amazon Glue 6.0](#migrating-version-60-from-51) 完成向 Amazon Glue 6.0 的迁移。

## Amazon Glue 6.0 版的连接器和 JDBC 驱动程序迁移
<a name="migrating-version-60-connector-driver-migration"></a>

有关已升级的 JDBC 和数据湖连接器的版本，请参阅：
+ [附录 B：JDBC 驱动程序升级](#migrating-version-60-appendix-jdbc-driver)
+ [附录 C：连接器升级](#migrating-version-60-appendix-connector)
+ [附录 D：开放表格式升级](#migrating-version-60-appendix-open-table-formats)

以下更改适用于 [附录 D：开放表格式升级](#migrating-version-60-appendix-open-table-formats) 中列出的针对 Amazon Glue 6.0的 OTF 版本升级。

**Apache Iceberg**  
注意以下更改：
+ Iceberg 已升级到 1.11.0，全面支持 Apache Iceberg 第 3 版规范。
+ 带有变体分解功能的 VARIANT 数据类型，可优化半结构化数据查询。
+ 纳秒精度时间戳。
+ 地理空间数据类型（Geometry 和 Geography）。

自 Amazon Glue 5.1 起，Amazon Glue ETL 已支持以下 Iceberg 功能：删除向量（使用存储在 Puffin 文件中的 Roaring Bitmap 进行读取时合并）以及通过 `first-row-id` 元数据进行行谱系跟踪。

**Apache Hudi**  
注意以下更改：
+ Hudi 已升级到 1.1.1。
+ 继续支持对在 Amazon Lake Formation 中注册的表进行 FTA 读写访问。

**Delta Lake**  
注意以下更改：
+ Delta Lake 已升级到 4.2.0。
+ 继续支持对在 Amazon Lake Formation 中注册的表进行 FTA 读写访问。

## 已知限制条件
<a name="migrating-version-60-known-limitations"></a>

以下限制适用于 Amazon Glue 6.0：
+ 不支持 Iceberg 原生表加密密钥。
+ 不支持 Iceberg 多参数转换。
+ 新的 Iceberg v3 数据类型仅支持 Spark DataFrames。这些功能不适用于 DynamicFrames。
+ Amazon Glue Studio 中的可视化 ETL 不支持新的 Iceberg v3 数据类型。要使用这些新功能，请使用 Amazon Glue API、SDK 或 Amazon CLI。或者，您也可以在由 Amazon Glue 提供支持的 Amazon SageMaker 融通式合作开发工作室中使用可视化 ETL。
+ VARIANT 列不支持精细访问控制（FGAC）。
+ Athena SQL 无法读取使用 `'format-version'='3'` 创建的 Iceberg 表（错误：`Cannot read unsupported version 3`）。使用 Iceberg v2 实现与 Athena 的跨引擎兼容。

## 附录 A：显著依赖项升级
<a name="migrating-version-60-appendix-dependencies"></a>

以下是依赖项升级：


| 依赖项 | Amazon Glue 6.0 中的版本 | Amazon Glue 5.1 中的版本 | Amazon Glue 5.0 中的版本 | Amazon 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 | 
| Amazon Glue Data Catalog 客户端 | 4.11.0 | 4.9.0 | 4.5.0 | 3.7.0 | 
| Amazon 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 驱动程序升级
<a name="migrating-version-60-appendix-jdbc-driver"></a>

以下是 JDBC 驱动程序升级：


| 驱动程序 | Amazon Glue 6.0 中的 JDBC 驱动程序版本 | Amazon Glue 5.1 中的 JDBC 驱动程序版本 | Amazon 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：连接器升级
<a name="migrating-version-60-appendix-connector"></a>

以下是连接器升级：


| 连接器 | Amazon Glue 6.0 中的版本 | Amazon Glue 5.1 中的版本 | Amazon 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.1.8 | 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：开放表格式升级
<a name="migrating-version-60-appendix-open-table-formats"></a>

下面是开放表格式升级：


| OTF | Amazon Glue 6.0 中的版本 | Amazon Glue 5.1 中的版本 | Amazon Glue 5.0 中的版本 | Amazon 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 | 