将 AWS Glue for Spark 作业迁移到 AWS Glue 版本 4.0 - AWS Glue

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 AWS Glue for Spark 作业迁移到 AWS Glue 版本 4.0

本主题介绍 AWS Glue 版本 0.9、1.0、2.0 和 3.0 之间的变化,允许您将 Spark 应用程序和 ETL 任务迁移到 AWS Glue 4.0。还介绍了 AWS Glue 4.0 中的功能以及使用它的优点。

要将此功能与 AWS Glue ETL 任务结合使用,请在创建任务时为 Glue version 选择 4.0

支持的新功能

此部分介绍 AWS Glue 版本 4.0 的新功能和优势。

  • 它基于 Apache Spark 3.3.0,拥有对 AWS Glue 和 Amazon EMR 的优化,如自适应查询运行、矢量化读取器以及优化的随机排序和分区合并。

  • 升级了 JDBC 驱动程序,适用于所有 AWS Glue 原生源,包括 MySQL、Microsoft SQL Server、Oracle、PostgreSQL、MongoDB,并且升级了 Spark 3.3.0 引入的 Spark 库和依赖项。

  • 更新了新的 Amazon Redshift 连接器和 JDBC 驱动程序。

  • 使用升级的 EMR 文件系统(EMRFS)优化了 Amazon S3 访问,并且默认启用了 Amazon S3 优化的输出提交程序。

  • 使用分区索引、下推谓词、分区列表和升级的 Hive 元存储客户端优了化数据目录访问。

  • 通过单元级筛选条件和数据湖事务,与受监管目录表的 Lake Formation 集成。

  • 减少了启动延迟,改善了整体任务完成时间和交互性。

  • Spark 任务以 1 秒为增量计费,按 10 倍缩短最短计费持续时间(从最短 10 分钟到最短 1 分钟)。

  • 本机支持 Apache Hudi、Delta Lake 和 Apache Iceberg 的开放数据湖框架。

  • 本机支持基于 Amazon S3 的 Cloud Shuffle 存储插件(Apache Spark 插件),从而使用 Amazon S3 进行洗牌和弹性存储容量。

从 Spark 3.1.1 到 Spark 3.3.0 的主要增强功能

请注意以下增强功能:

  • 行级运行时筛选(SPARK-32268)。

  • ANSI 增强功能(SPARK-38860)。

  • 错误消息改进(SPARK-38781)。

  • 支持 Parquet 矢量化阅读器(SPARK-34863)的复杂类型。

  • 支持 Spark SQL(SPARK-37273)的隐藏文件元数据。

  • 为 Python/Pandas UDF 提供分析器(SPARK-37443)。

  • 推出 Trigger.AvailableNow 来分批运行像 Trigger.Once 这样的流式查询(SPARK-36533)。

  • 更全面的 Datasource V2 下推功能(SPARK-38788)。

  • 从 log4j 1 迁移到 log4j 2(SPARK-37814)。

其他显著的变化

注意以下更改:

  • 重大更改

    • 删除文档和 Python/Docs 中对 Python 3.6 支持的引用(SPARK-36977)。

    • 通过将内置 pickle 替换为 cloudpickle 来移除命名的元组黑客攻击(SPARK-32079)。

    • 将 pandas 的最低版本提高到 1.0.5(SPARK-37465)。

用于迁移到 AWS Glue 4.0 的操作

对于现有任务,请将 Glue version 从以前的版本更改为任务配置中的 Glue 4.0

  • 在 AWS Glue Studio 中,为 Glue version 选择 Glue 4.0 - Supports Spark 3.3, Scala 2, Python 3

  • 在 API 中,为 UpdateJob API 操作中的 GlueVersion 参数选择 4.0

对于新任务,请在创建任务时选择 Glue 4.0

  • 在控制台中,为 Glue version 选择 Spark 3.3, Python 3 (Glue Version 4.0) or Spark 3.3, Scala 2 (Glue Version 3.0)

  • 在 AWS Glue Studio 中,为 Glue version 选择 Glue 4.0 - Supports Spark 3.3, Scala 2, Python 3

  • 在 API 中,为 CreateJob API 操作中的 GlueVersion 参数选择 4.0

要查看从 AWS Glue 2.0 或更早版本到 AWS Glue 4.0 的 Spark 事件日志,请使用 AWS CloudFormation 或 Docker 为 AWS Glue 4.0 启动已升级的 Spark 历史服务器

迁移核对清单

查看此核对清单以进行迁移:

注意

有关与 AWS Glue 3.0 相关的核对清单项目,请参阅迁移核对清单

  • 您的任务的外部 Python 库是否依赖于 Python 2.7/3.6?

    • 将依赖库从 Python 2.7/3.6 更新为 Python 3.10,因为 Spark 3.3.0 完全删除了 Python 2.7 和 3.6 支持。

从 AWS Glue 3.0 迁移到 AWS Glue 4.0

迁移时,请注意以下更改:

  • 所有现有任务参数和 AWS Glue 3.0 中存在的主要功能将存在于 AWS Glue 4.0。

  • AWS Glue 3.0 使用 Amazon EMR 优化的 Spark 3.1.1,AWS Glue 4.0 使用 Amazon EMR 优化的 Spark 3.3.0。

    仅有几项 Spark 更改可能需要修订脚本,确保不会引用已删除的功能。

  • AWS Glue 4.0 还包括对 EMRFS 和 Hadoop 的更新。有关特定版本,请参阅附录 A:显著依赖项升级

  • ETL 任务中提供的 AWS 开发工具包现已从 1.11 升级到 1.12。

  • 所有 Python 作业都将使用 Python 版本 3.10。以前,AWS Glue 3.0 中使用 Python 3.7。

    因此,AWS Glue 一些即用的 pymodule 得到了升级。

  • Log4j 已升级到 Log4j2。

    • 有关 Log4j2 迁移路径的信息,请参阅 Log4j 文档

    • 必须改为将任何自定义 log4j.properties 文件重命名为 log4j2.properties 文件,并使用相应的 log4j2 属性。

  • 有关迁移某些连接器的信息,请参阅AWS Glue 4.0 版的连接器和 JDBC 驱动程序迁移

  • AWS 加密 SDK 从 1.x 升级到 2.x。使用 AWS Glue 安全配置的 AWS Glue 作业和依赖于运行时提供的 AWS 加密 SDK 依赖项的作业会受到影响。请参阅 AWS Glue 作业迁移说明。

    您可以安全地将 AWS Glue 2.0/3.0 作业升级到 AWS Glue 4.0 作业,因为 AWS Glue 2.0/3.0 已经包含 AWS 加密 SDK 桥接版本。

请参阅 Spark 迁移文档:

从 AWS Glue 2.0 迁移到 AWS Glue 4.0

迁移时,请注意以下更改:

注意

有关与 AWS Glue 3.0 相关的迁移步骤,请参阅从 AWS Glue 3.0 迁移到 AWS Glue 4.0

  • 所有现有任务参数和 AWS Glue 2.0 中存在的主要功能将存在于 AWS Glue 4.0。

  • 预设情况下,自 AWS Glue 3.0,将启用经 EMRFS S3 优化的提交程序,用于将 Parquet 数据写入 Amazon S3。但是,您仍然可以通过将 --enable-s3-parquet-optimized-committer 设置为 false 来禁用。

  • AWS Glue 2.0 使用开源 Spark 2.4,AWS Glue 4.0 使用 Amazon EMR 优化的 Spark 3.3.0。

    • 仅有几项 Spark 更改可能需要修订脚本,确保不会引用已删除的功能。

    • 例如,Spark 3.3.0 不启用 Scala 无类型的 UDF,但 Spark 2.4 允许它们。

  • ETL 任务中提供的 AWS 开发工具包现已从 1.11 升级到 1.12。

  • AWS Glue 4.0 还更新了 EMRFS、JDBC 驱动程序,并且对 AWS Glue 提供的 Spark 进行了额外优化。

  • Scala 也从 2.11 更新到 2.12,Scala 2.12 不向后兼容 Scala 2.11。

  • Python 3.10 还是 Python 脚本使用的默认版本,因为 AWS Glue 2.0 仅使用了 Python 3.7和 2.7。

    • Spark 3.3.0 不支持 Python 2.7。任何在作业配置中请求 Python 2 的任务都会因为 IllegalArgumentException 而失败。

    • 自 AWS Glue 2.0 以来,提供了一种安装额外 Python 模块的新机制。

  • 多个依赖项更新,在 附录 A:显著依赖项升级 中突出显示。

  • 现有 AWS Glue 2.0 任务中提供的任何额外 JAR 文件都可能会带来导致冲突的依赖项,因为 4.0 中的几个依赖项从 2.0 升级。您可以使用 --user-jars-first AWS Glue 作业参数,避免 AWS Glue 4.0 中的类路径冲突。

  • AWS Glue 4.0 使用 Spark 3.3。从 Spark 3.1 开始,从/到 parquet 文件加载/保存时间戳的行为发生了变化。有关更多详细信息,请参阅 从 Spark SQL 3.0 升级到 3.1

    在读取/写入包含时间戳列的 parquet 数据时,建议设置以下参数。设置这些参数可以解决 Spark 2 到 Spark 3 升级期间发生的 AWS Glue 动态帧和 Spark 数据帧的日历不兼容问题。使用 CORRECTED(更正)选项将按原样读取日期时间值;使用 LEGACY(旧式)选项将根据读取期间的日历差异重新设置日期时间值的基础。

    - Key: --conf - Value: spark.sql.legacy.parquet.int96RebaseModeInRead=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.int96RebaseModeInWrite=[CORRECTED|LEGACY] --conf spark.sql.legacy.parquet.datetimeRebaseModeInRead=[CORRECTED|LEGACY]
  • 有关迁移某些连接器的信息,请参阅AWS Glue 4.0 版的连接器和 JDBC 驱动程序迁移

  • AWS 加密 SDK 从 1.x 升级到 2.x。使用 AWS Glue 安全配置的 AWS Glue 作业和依赖于运行时提供的 AWS 加密 SDK 依赖项的作业会受到影响。请参阅以下有关 AWS Glue 工作迁移的说明:

    • 您可以安全地将 AWS Glue 2.0 作业升级到 AWS Glue 4.0 作业,因为 AWS Glue 2.0 已经包含 AWS 加密 SDK 桥接版本。

请参阅 Spark 迁移文档:

从 AWS Glue 1.0 迁移到 AWS Glue 4.0

迁移时,请注意以下更改:

  • AWS Glue 1.0 使用开源 Spark 2.4,AWS Glue 4.0 使用 Amazon EMR 优化的 Spark 3.3.0。

    • 仅有几项 Spark 更改可能需要修订脚本,确保不会引用已删除的功能。

    • 例如,Spark 3.3.0 不启用 Scala 无类型的 UDF,但 Spark 2.4 允许它们。

  • AWS Glue 4.0 中的所有任务均会执行,显著缩短启动时间。Spark 任务以 1 秒为增量计费,按 10 倍缩短最短计费持续时间,因为启动延迟从最长 10 分钟到最长 1 分钟。

  • 在 AWS Glue 4.0 中,记录行为发生了显著变化,Spark 3.3.0 的最低要求为 Log4j2。

  • 多个依赖项更新,在附录中突出显示。

  • Scala 也从 2.11 更新到 2.12,Scala 2.12 不向后兼容 Scala 2.11。

  • Python 3.10 还是 Python 脚本使用的默认版本,因为 AWS Glue 0.9 仅使用了 Python 2。

    Spark 3.3.0 不支持 Python 2.7。任何在作业配置中请求 Python 2 的任务都会因为 IllegalArgumentException 而失败。

  • 从 AWS Glue 2.0 开始,提供通过 pip 安装额外 Python 模块的新机制。有关更多信息,请参阅使用 pip 在 AWS Glue 2.0+ 中安装其他 Python 模块

  • AWS Glue 4.0 不会在 Apache YARN 上运行,因此 YARN 设置不适用。

  • AWS Glue 4.0 没有 Hadoop Distributed File System (HDFS)。

  • 现有 AWS Glue 1.0 任务中提供的任何额外 JAR 文件都可能会带来导致冲突的依赖项,因为 4.0 中的几个依赖项从 1.0 升级。为了避免这个问题,我们默认使用 --user-jars-firstAWS Glue 作业参数启用 AWS Glue 4.0。

  • AWS Glue 4.0 现在支持 Auto Scaling。因此,启用 Auto Scaling 后,ExecutorAllocationManager 指标将可用。

  • 在 AWS Glue 版本 4.0 任务中,您可以指定工件数量和工件类型,但不能指定 maxCapacity

  • AWS Glue 4.0 尚不支持机器学习转换。

  • 有关迁移某些连接器的信息,请参阅 AWS Glue 4.0 版的连接器和 JDBC 驱动程序迁移

  • AWS 加密 SDK 从 1.x 升级到 2.x。使用 AWS Glue 安全配置的 AWS Glue 作业和依赖于运行时提供的 AWS 加密 SDK 依赖项的作业会受到影响。有关 AWS Glue 工作迁移的信息,请参阅这些说明。

    • 您无法将 AWS Glue 0.9/1.0 作业直接迁移到 AWS Glue 4.0 作业。这是因为当直接升级到 2.x 或更高版本并立即启用所有新功能时,AWS 加密开发工具包将无法解密在早期版本的 AWS 加密开发工具包下加密的加密文字。

    • 为了安全升级,我们首先建议您迁移到包含 AWS 加密开发工具包桥接版本的 AWS Glue 2.0/3.0 作业。运行一次作业即可使用 AWS 加密开发工具包桥接版本。

    • 完成后,您可以安全地将 AWS Glue 2.0/3.0 作业迁移到 AWS Glue 4.0。

请参阅 Spark 迁移文档:

从 AWS Glue 0.9 迁移到 AWS Glue 4.0

迁移时,请注意以下更改:

  • AWS Glue 0.9 使用开源 Spark 2.2.1,AWS Glue 4.0 使用 Amazon EMR 优化的 Spark 3.3.0。

    • 仅有几项 Spark 更改可能需要修订脚本,确保不会引用已删除的功能。

    • 例如,Spark 3.3.0 不启用 Scala 无类型的 UDF,但 Spark 2.2 允许它们。

  • AWS Glue 4.0 中的所有任务均会执行,显著缩短启动时间。Spark 任务以 1 秒为增量计费,按 10 倍缩短最短计费持续时间,因为启动延迟从最长 10 分钟到最长 1 分钟。

  • 自 AWS Glue 4.0 以来,日志记录行为发生了重大变化,Spark 3.3.0 的最低要求为 Log4j2,如此处所述 (https://spark.apache.org/docs/latest/core-migration-guide.html#upgrading-from-core-32-to-33)。

  • 多个依赖项更新,在附录中突出显示。

  • Scala 也从 2.11 更新到 2.12,Scala 2.12 不向后兼容 Scala 2.11。

  • Python 3.10 还是 Python 脚本使用的默认版本,因为 AWS Glue 0.9 仅使用了 Python 2。

    • Spark 3.3.0 不支持 Python 2.7。任何在作业配置中请求 Python 2 的任务都会因为 IllegalArgumentException 而失败。

    • 提供一种通过 pip 安装额外 Python 模块的新机制。

  • AWS Glue 4.0 不会在 Apache YARN 上运行,因此 YARN 设置不适用。

  • AWS Glue 4.0 没有 Hadoop Distributed File System (HDFS)。

  • 现有 AWS Glue 0.9 任务中提供的任何额外 JAR 文件都可能会带来导致冲突的依赖项,因为 3.0 中的几个依赖项从 0.9 升级。您可以使用 --user-jars-first AWS Glue 任务参数,避免 AWS Glue 3.0 中的类路径冲突。

  • AWS Glue 4.0 现在支持 Auto Scaling。因此,启用 Auto Scaling 后,ExecutorAllocationManager 指标将可用。

  • 在 AWS Glue 版本 4.0 任务中,您可以指定工件数量和工件类型,但不能指定 maxCapacity

  • AWS Glue 4.0 尚不支持机器学习转换。

  • 有关迁移某些连接器的信息,请参阅 AWS Glue 4.0 版的连接器和 JDBC 驱动程序迁移

  • AWS 加密 SDK 从 1.x 升级到 2.x。使用 AWS Glue 安全配置的 AWS Glue 作业和依赖于运行时提供的 AWS 加密 SDK 依赖项的作业会受到影响。有关 AWS Glue 工作迁移的信息,请参阅这些说明。

    • 您无法将 AWS Glue 0.9/1.0 作业直接迁移到 AWS Glue 4.0 作业。这是因为当直接升级到 2.x 或更高版本并立即启用所有新功能时,AWS 加密开发工具包将无法解密在早期版本的 AWS 加密开发工具包下加密的加密文字。

    • 为了安全升级,我们首先建议您迁移到包含 AWS 加密开发工具包桥接版本的 AWS Glue 2.0/3.0 作业。运行一次作业即可使用 AWS 加密开发工具包桥接版本。

    • 完成后,您可以安全地将 AWS Glue 2.0/3.0 作业迁移到 AWS Glue 4.0。

请参阅 Spark 迁移文档:

AWS Glue 4.0 版的连接器和 JDBC 驱动程序迁移

有关已升级的 JDBC 和数据湖连接器的版本,请参阅:

Hudi

  • Spark SQL 支持方面的改进:

    • 通过 Call Procedure 命令,增加了对升级、降级、引导、清理和修复的支持。可以在 Spark SQL 中使用 Create/Drop/Show/Refresh Index 语法。

    • 与 Spark SQL 相比,通过 Spark DataSource 使用之间的性能差距已经缩小。过去,数据源写入速度比 SQL 快。

    • 所有内置密钥生成器都实现了更高性能的 Spark 特定 API 操作。

    • 将批量 insert 操作中的 UDF 转换替换为 RDD 转换,以降低使用 SerDe 的成本。

    • 带有 Hudi 的 Spark SQL 要求 primaryKey 在 SQL 语句中由 tblproperites 或选项指定。对于更新和删除操作,preCombineField 也是必需的。

  • 从 0.10.0 版本开始创建的任何没有 primaryKey 的 Hudi 表都需要使用自版本 0.10.0 起的 primaryKey 字段重新创建。

PostgreSQL

  • 多个漏洞(CVE)已得到解决。

  • 本机支持 Java 8。

  • 如果任务是使用数组的数组,则除字节数组外,可以将此场景视为多维数组。

MongoDB

  • 当前的 MongoDB 连接器支持 Spark 3.1 或更高版本以及 MongoDB 版本 4.0 或更高版本。

  • 由于连接器升级,一些属性名称发生了变化。例如,URI 属性名更改为 connection.uri。有关当前选项的更多信息,请参阅 MongoDB Spark 连接器博客

  • 使用 Amazon DocumentDB 托管的 MongoDB 4.0 有一些功能差异。有关更多信息,请参阅以下主题:

  • “partitioner”(分区程序)选项仅限于 ShardedPartitionerPaginateIntoPartitionsPartitioner、和 SinglePartitionPartitioner。它不能为 Amazon DocumentDB 使用默认 SamplePartitionerPaginateBySizePartitioner,因为阶段运算符不支持 MongoDB API。有关更多信息,请参阅支持的 MongoDB API、操作和数据类型

Delta Lake

  • Delta Lake 现在支持在 SQL 中进行时空旅行,以便轻松查询较旧的数据。在此更新中,时空旅行现在既可以在 Spark SQL 中使用,也可以通过 DataFrame API 使用。已在 SQL 中添加了对当前版本的 TIMESTAMP 的支持。

  • Spark 3.3 推出了用于运行流式查询的 Trigger.AvailableNow,等同于 Trigger.Once 批量查询。在使用 Delta 表作为流媒体源时,此支持也可用。

  • 支持 SHOW COLUMNS 返回表中的列表。

  • 在 Scala 和 Python DeltaTable API 中支持 DESCRIBE DETAIL。它使用 DeltaTable API 或 Spark SQL 检索有关 Delta 表的详细信息。

  • 支持从 SQL 删除合并更新命令返回操作指标。以前这些 SQL 命令返回一个空的 DataFrame,现在它们返回一个 DataFrame,其中包含有关所执行操作的有用指标。

  • 优化性能改进:

    • 将配置选项 spark.databricks.delta.optimize.repartition.enabled=true 设置为在“优化”命令使用 repartition(1) 而不是 coalesce(1),以提高压缩许多小文件时的性能。

    • 通过使用基于队列的方法对压缩作业进行并行化来提高性能

  • 其他显著的变化:

Apache Iceberg

  • 为扫描计划和 Spark 查询添加了多项性能改进

  • 添加了一个通用 REST 目录客户端,该客户端使用基于更改的提交来解决服务端的提交冲突。

  • 支持 SQL 时空旅行查询的 AS OF 语法。

  • 为 MERGE 和 UPDATE 查询添加了读取时合并支持。

  • 添加了对使用 Z 顺序重写分区的支持。

  • 为 Puffin 添加了规范和实施,这是一种用于大型统计数据和索引 blob 的格式,例如 Theta sketch 或布隆过滤器。

  • 添加了用于增量使用数据的新接口(追加和更改日志扫描)。

  • 增加了对 FileIO 接口的批量操作和远程读取的支持。

  • 增加了更多元数据表,以显示元数据树中的删除文件。

  • 删除表的行为发生了变化。在 Iceberg 0.13.1 中,运行 DROP TABLE 会将表从目录中移除,同时删除表内容。在 Iceberg 1.0.0 中,DROP TABLE 仅将表从目录中删除。要删除表格内容,请使用 DROP TABLE PURGE

  • 在 Iceberg 1.0.0 中,Park 矢量化读取默认启用。如果要禁用矢量化读取,请设置 read.parquet.vectorization.enabledfalse

Oracle

更改很小。

MySQL

更改很小。

Amazon Redshift

AWS Glue 4.0 采用了新的 Amazon Redshift 连接器和新的 JDBC 驱动程序。有关增强功能以及如何从先前 AWS Glue 版本迁移的信息,请参阅Redshift 连接

附录 A:显著依赖项升级

以下是依赖项升级:

依赖关系 AWS Glue 4.0 中的版本 AWS Glue 3.0 中的版本 AWS Glue 2.0 中的版本 AWS Glue 1.0 中的版本
Spark 3.3.0-amzn-1 3.1.1-amzn-0 2.4.3 2.4.3
Hadoop 3.3.3-amzn-0 3.2.1-amzn-3 2.8.5-amzn-5 2.8.5-amzn-1
Scala 2.12 2.12 2.1.1 2.1.1
Jackson 2.13.3 2.10.x 2.7.x 2.7.x
Hive 2.3.9-amzn-2 2.3.7-amzn-4 1.2 1.2
EMRFS 2.54.0 2.46.0 2.38.0 2.30.0
Json4s 3.7.0-M11 3.6.6 3.5.x 3.5.x
Arrow 7.0.0 2.0.0 0.10.0 0.10.0
AWS Glue 数据目录客户端 3.7.0 3.0.0 1.10.0 不适用
Python 3.10 3.7 2.7 和 3.6 2.7 和 3.6
Boto 1.26 1.18 1.12 不适用

附录 B:JDBC 驱动程序升级

以下是 JDBC 驱动程序升级:

驱动程序 过去 AWS Glue 版本中的 JDBC 驱动程序版本 AWS Glue 3.0 中的 JDBC 驱动程序版本 AWS Glue 4.0 中的 JDBC 驱动程序版本
MySQL 5.1 8.0.23 8.0.23
Microsoft SQL Server 6.1.0 7.0.0 9.4.0
Oracle 数据库 11.2 21.1 21.7
PostgreSQL 42.1.0 42.2.18 42.3.6
MongoDB 2.0.0 4.0.0 4.7.2
Amazon Redshift

redshift-jdbc41-1.2.12.1017

redshift-jdbc41-1.2.12.1017

redshift-jdbc42-2.1.0.16

附录 C:连接器升级

以下是连接器升级:

驱动程序 AWS Glue 3.0 中的连接器版本 AWS Glue 4.0 中的连接器版本
MongoDB 3.0.0 10.0.4
Hudi 0.10.1 0.12.1
Delta Lake 1.0.0 2.1.0
Iceberg 0.13.1 1.0.0
DynamoDB 1.11 1.12