将 Amazon Glue for Spark 作业迁移到 Amazon Glue 版本 3.0 - Amazon Glue
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

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

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

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

支持的新功能

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

  • 它基于 Apache Spark 3.1.1,拥有来自开源 Spark 的优化,通过 Amazon 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 用户界面体验。

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

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

用于迁移到 Amazon 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)

  • 在 Amazon 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)

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

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

要查看 Amazon 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 是否冲突?

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

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

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

    • Amazon 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 支持。

从 Amazon Glue 0.9 迁移到 Amazon Glue 3.0

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

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

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

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

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

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

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

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

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

    • Spark 3.1.1 不支持 Python 2.7。

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

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

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

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

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

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

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

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

请参阅 Spark 迁移文档:

从 Amazon Glue 1.0 迁移到 Amazon Glue 3.0

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

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

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

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

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

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

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

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

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

    • Spark 3.1.1 不支持 Python 2.7。

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

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

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

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

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

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

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

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

请参阅 Spark 迁移文档:

从 Amazon Glue 2.0 迁移到 Amazon Glue 3.0

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

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

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

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

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

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

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

  • Amazon 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。

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

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

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

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

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

  • Amazon Glue 3.0 使用的是 Spark 3.1,改变了从/到 parquet 文件加载/保存时间戳的行为。有关更多详细信息,请参阅 从 Spark SQL 3.0 升级到 3.1

    在读取/写入包含时间戳列的 parquet 数据时,建议设置以下参数。设置这些参数可以解决 Spark 2 到 Spark 3 升级期间发生的 Amazon 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:显著依赖项升级

以下是依赖项升级:

依赖关系 Amazon Glue 0.9 中的版本 Amazon Glue 1.0 中的版本 Amazon Glue 2.0 中的版本 Amazon 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.11 2.11 2.11 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
Amazon Glue Catalog 客户端 不适用 不适用 1.10.0 3.0.0

附录 B:JDBC 驱动程序升级

以下是 JDBC 驱动程序升级:

驱动程序 过去 Amazon Glue 版本中的 JDBC 驱动程序版本 Amazon 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