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

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

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

本主题介绍 AWS Glue 版本 0.9、1.0、2.0 和 3.0 之间的变化,允许您将 Spark 应用程序和 ETL 任务迁移到 AWS Glue 3.0。

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

支持的新功能

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

  • 它基于 Apache Spark 3.1.1,拥有来自开源 Spark 的优化,通过 AWS Glue 和 EMR 服务(如自适应查询执行、矢量化读取器以及优化的随机排序和分区合并)开发。

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

  • 使用升级的 EMRFS 优化了 Amazon S3 访问,并且默认启用了 Amazon S3 优化的输出提交程序。

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

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

  • 使用新的 Spark 执行程序内存指标和 Spark 结构化流式传输指标,提高了 Spark 3.1.1 的 Spark 用户界面体验。

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

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

用于迁移到 AWS Glue 3.0 的操作

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

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

  • 在 AWS Glue Studio 中,为 Glue version 选择 Glue 3.0 - Supports spark 3.1, Scala 2, Python 3

  • 在 API 中,为 UpdateJob API 中的 GlueVersion 参数选择 3.0

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

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

  • 在 AWS Glue Studio 中,为 Glue version 选择 Glue 3.0 - Supports spark 3.1, Scala 2, Python 3

  • 在 API 中,为 CreateJob API 中的 GlueVersion 参数选择 3.0

要查看 AWS Glue 3.0 的 Spark 事件日志,请使用 CloudFormation 或 Docker 为 Glue 3.0 启动升级的 Spark 历史记录服务器

迁移核对清单

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

  • 您的任务是否依赖于 HDFS? 如果是,请尝试使用 S3 替换 HDFS。

    • 在任务脚本代码中搜索以 hdfs:// 或者 / 开头且作为 DFS 路径的文件系统路径。

    • 检查您的默认文件系统是否已使用 HDFS 配置。如果已显式配置,则需要删除 fs.defaultFS 配置。

    • 检查您的任务是否包含任何 dfs.* 参数。如果它包含任何参数,则需要验证是否可以禁用参数。

  • 您的任务是否依赖于 YARN? 如果是,请检查您的任务是否包含以下参数,以验证影响。如果它包含任何参数,则需要验证是否可以禁用参数。

    • spark.yarn.*

      例如:

      spark.yarn.executor.memoryOverhead spark.yarn.driver.memoryOverhead spark.yarn.scheduler.reporterThread.maxFailures
    • yarn.*

      例如:

      yarn.scheduler.maximum-allocation-mb yarn.nodemanager.resource.memory-mb
  • 您的任务是否依赖于 Spark 2.2.1 或 Spark 2.4.3? 如果是,请检查您的任务是否使用 Spark 3.1.1 中更改的功能以验证影响。

    • https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-22-to-23

      例如,percentile_approx 函数或具有 SparkSession.builder.getOrCreate()SparkSession(当存在现有 SparkContext 时)。

    • https://spark.apache.org/docs/latest/sql-migration-guide.html#upgrading-from-spark-sql-23-to-24

      例如,array_contains 函数,或者具有 spark.sql.caseSensitive=trueCURRENT_DATECURRENT_TIMESTAMP 函数。

  • 在 Glue 3.0 中,您的任务的额外 jars 是否冲突?

    • 对于 AWS Glue 0.9/1.0:现有 AWS Glue 0.9/1.0 任务中提供的额外 jars 可能会因 Glue 3.0 中的升级或新依赖项而导致类路径冲突。您可以使用 --user-jars-first AWS Glue 任务参数或者为依赖项填充阴影,避免 AWS Glue 3.0 中的类路径冲突。

    • 对于 AWS Glue 2.0:您仍然可以使用 --user-jars-first AWS Glue 任务参数或者为依赖项填充阴影,避免 AWS Glue 3.0 中的类路径冲突。

  • 您的任务是否依赖于 Scala 2.11?

    • AWS Glue 3.0 使用 Scala 2.12,因此如果您的库依赖于 Scala 2.11,您需要使用 Scala 2.12 重新构建您的库。

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

    • 使用 --additional-python-modules 参数,而不是在 Python 库路径中设置 egg/wheel/zip 格式文件。

    • 将依赖库从 Python 2.7/3.6 更新为 Python 3.7,因为 Spark 3.1.1 删除了 Python 2.7 支持。

从 AWS Glue 0.9 迁移到 AWS Glue 3.0

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

  • AWS Glue 0.9 使用开源 Spark 2.2.1,AWS Glue 3.0 使用 EMR 优化的 Spark 3.1.1。

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

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

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

  • 日志记录行为自 AWS Glue 2.0 起已更改。

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

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

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

    • Spark 3.1.1 不支持 Python 2.7。

    • 额外 Python 模块安装的新机制可用。

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

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

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

  • AWS Glue 3.0 尚不支持动态分配,因此 ExecutorAllocationManager 指标不可用。

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

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

  • AWS Glue 3.0 尚不支持开发终端节点。

请参阅 Spark 迁移文档:

从 AWS Glue 1.0 迁移到 AWS Glue 3.0

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

  • AWS Glue 1.0 使用开源 Spark 2.4,AWS Glue 3.0 使用 EMR 优化的 Spark 3.1.1。

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

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

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

  • 日志记录行为自 AWS Glue 2.0 起已更改。

  • 多个依赖项更新,突出显示

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

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

    • Spark 3.1.1 不支持 Python 2.7。

    • 额外 Python 模块安装的新机制可用。

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

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

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

  • AWS Glue 3.0 尚不支持动态分配,因此 ExecutorAllocationManager 指标不可用。

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

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

  • AWS Glue 3.0 尚不支持开发终端节点。

请参阅 Spark 迁移文档:

从 AWS Glue 2.0 迁移到 AWS Glue 3.0

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

  • 所有现有任务参数和 AWS Glue 2.0 中存在的主要功能将存在于 AWS Glue 3.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 3.0 使用 EMR 优化的 Spark 3.1.1。

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

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

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

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

  • Spark 3.1.1 不支持 Python 2.7。

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

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

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

  • AWS Glue 3.0 在驱动程序/执行器配置方面的 Spark 任务并行性与 AWS Glue 2.0 有所不同,提高了性能并更好地利用了可用资源。spark.driver.coresspark.executor.cores 都配置为 AWS Glue 3.0 上的内核数(标准和 G.1X 工件上为 4 个,G.2X 工件上为 8 个)。这些配置不会更改 AWS Glue 任务的工件类型或硬件。您可以使用这些配置来计算分区或拆分的数量,以匹配 Spark 应用程序中的 Spark 任务并行性。

    通常,与 AWS Glue 2.0 相比,作业的性能要么相似,要么有所提高。如果作业运行速度较慢,则可以通过传递以下作业参数来提高作业并行度:

    • 键:--executor-cores 值:<可以并行运行的所需任务数>

    • 该值不能超过工作线程类型上 vCPU 数量的 2 倍,即 G.1X 上为 8、G.2X 上为 16、G.4X 上为 32,G.8X 上为 64。更新此配置时应谨慎行事,因为它可能会影响作业性能,因为并行度增加会导致内存和磁盘面临压力,并可能限制源系统和目标系统。

  • AWS Glue 3.0 使用的是 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]

请参阅 Spark 迁移文档:

附录 A:显著依赖项升级

以下是依赖项升级:

依赖关系 AWS Glue 0.9 中的版本 AWS Glue 1.0 中的版本 AWS Glue 2.0 中的版本 AWS Glue 3.0 中的版本
Spark 2.2.1 2.4.3 2.4.3 3.1.1-amzn-0
Hadoop 2.7.3-amzn-6 2.8.5-amzn-1 2.8.5-amzn-5 3.2.1-amzn-3
Scala 2.1.1 2.1.1 2.1.1 2.12
Jackson 2.7.x 2.7.x 2.7.x 2.10.x
Hive 1.2 1.2 1.2 2.3.7-amzn-4
EMRFS 2.20.0 2.30.0 2.38.0 2.46.0
Json4s 3.2.x 3.5.x 3.5.x 3.6.6
箭头 不适用 0.10.0 0.10.0 2.0.0
AWS Glue Catalog 客户端 不适用 不适用 1.10.0 3.0.0

附录 B:JDBC 驱动程序升级

以下是 JDBC 驱动程序升级:

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