为什么我的 AWS Glue ETL 作业长时间运行?

3 分钟阅读
0

我的 AWS Glue 任务运行了很长时间。或者,我的 AWS Glue straggler 任务需要很长时间才能完成。

解决方法

可能导致 AWS Glue 作业长时间运行的常见因素包括配置设置以及数据和脚本的结构。

以下步骤有助于优化性能。

设置指标和日志记录

要发现问题并优化性能,请使用 AWS Glue 的集成监控工具,例如 Amazon CloudWatch作业可观测性指标

此外,设置异常警报,并打开 Apache Spark UI,以便更好地了解 AWS Glue 作业的运行情况。您可以使用 AWS Glue 作业运行洞察功能来详细了解作业运行时的行为。

要激活指标,请完成以下任一操作。

通过 AWS Glue 控制台

  1. 打开 AWS Glue 控制台
  2. 在导航窗格中,选择 ETL Jobs(ETL 作业)。
  3. 选择要为其启用指标的作业。
  4. 选择 Action(操作),然后选择 Edit job(编辑作业)。
  5. 在 Job Details(作业详细信息)选项卡中的 Advanced(高级)选项下,选择 Job metrics(作业指标)、Job observability metrics(作业可观测性指标)、Continuous logging(持续日志记录)和 Spark UI
  6. 选择 Save(保存)。

通过 CLI 或 SDK

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

通过 API 调用或 CLI,在 DefaultArguments 参数中传递以下参数:

'--enable-metrics' : 'true'
'--enable-observability-metrics' : 'true'
'--enable-continuous-cloudwatch-log' : 'true'
'--enable-spark-ui' : 'true'
'--spark-event-logs-path' : '<s3://path/to/log/>'

确定瓶颈

要找到瓶颈,请使用作业运行生成的 CloudWatch 驱动程序日志,或使用 Spark UI 日志。AWS Glue 3.0 及更高版本可以利用自适应查询执行 (AQE) 等 Spark 原生功能处理偏差连接。有关详细信息,请参阅 Apache 网站上的 Web UI

驱动程序日志

要检查驱动程序日志,请执行以下操作:

  1. AWS Glue 控制台打开作业。
  2. Runs(运行)选项卡上,选择要检查日志的作业运行。
  3. 在 CloudWatch 日志组 /aws-glue/jobs/error 中,选择与您打开日志的作业运行 ID 同名的日志流。查找名称后缀为“_g-xxxxxx”的流,这些是执行程序日志。
  4. 在驱动程序日志中,检查是否存在运行很长时间才完成的任务。在以下示例中,一个任务运行了 34 分钟,创建该任务的 Spark 作业在 35 分钟内完成。
    2024-09-13 10:06:13,847 INFO [task-result-getter-0] scheduler.TaskSetManager (Logging.scala:logInfo(61)): Finished task 0.0 in stage 0.0 (TID 0) in 2054673 ms on 172.35.184.56 (executor 1) (1/1)
    2024-09-13 10:06:13,894 INFO [Thread-13] scheduler.DAGScheduler (Logging.scala:logInfo(61)): Job 0 finished: save at DataSink.scala:666, took 2164.67 s

Spark UI 日志

在 Spark UI 日志中,在 Jobs(作业)和 Stages(阶段)选项卡上,查找运行了很长时间的阶段和任务。

修复瓶颈

更高效地对数据进行分区。AWS Glue 作业依赖于分布式处理。如果数据分区效率不高,则 Spark Worker 可能必须处理大型、不平衡的分区。这种处理时间会导致延迟。要控制分区的数量,请使用 Spark 中的 repartition() 或 coalesce() 函数。确保您的数据分区良好,以利用 Spark 的分布式特性。您还可以配置 AWS Glue DynamicFrame 以使用 splitFields 或自定义分区键对数据进行分区。

通过添加 Worker 节点来增加容量。如果没有足够的 Worker 节点来处理大量数据,则由于并行性有限,作业运行缓慢。增加 Worker 节点的数量,或切换到更大的 Worker 类型。确保使用适当的 Worker 规模,并分配足够的 DPU(数据处理单元)来高效地处理数据。每个执行程序处理的任务数等于 DPU 数量的四倍。例如,一个 G.1X Worker 类型有一个 DPU,每个执行程序处理四个任务。请注意,G.4X 和 G.8X Worker 类型仅适用于 AWS Glue 版本 3.0 或更高版本的 Spark ETL 作业。

重新分配数据以减少分区间的偏差。当分区的数据量明显不同时,就会出现数据偏差。拥有更多数据的节点超负荷工作,而其他节点则处于空闲状态。通过分析数据分布来识别偏斜的键。在分区之间重新分配或平衡数据,或使用加盐技术来分散热键。AWS Glue 3.0 及更高版本可以使用 Spark 原生功能(例如 Apache 网站上的自适应查询执行 (AQE))来处理偏差连接。为此,请开启自适应查询执行 (AQE) 并将 spark.sql.adaptive.skewJoin.enabled 设置为 true。从 spark 3.2.0 开始,AQE 默认处于开启状态。要启用 AQE for Glue 3.0,请添加参数 spark.sql.adaptive.enabled 并将其设置为 true。

将 UDF 替换为原生 Spark 功能。自定义用户定义功能 (UDF) 或复杂转换的运行成本可能很高,并且会减慢 Spark 作业的速度。尽可能避免 UDF,并依靠针对性能进行了优化的原生 Spark 功能。如果需要 UDF,请使用 Scala 而不是 Python 进行重写,因为 Scala UDF 通常性能更好。此外,为了更好地优化,请使用 DataFrames 或 DynamicFrames 应用转换。

最大限度减少重组操作。诸如 groupBy、join 或 orderBy 之类的重组操作可跨节点传输数据。如果过度使用或管理不当,它们可能会成为瓶颈。通过在转换过程中尽早筛选并聚合数据,最大限度地减少重组操作。为避免不必要的数据传输,请在适用的情况下使用广播连接。此外,请确保对重组的数据进行高效的分区。

移除不需要的缓存。过度使用或不当使用缓存会导致内存消耗增加,并可能减慢作业速度。仅当您在工作流程中多次重复使用数据集时才使用 cache() 或 persist()。记下可用内存,并在不再需要这些数据集时使用 unpersist() 清除所有缓存的数据集。

打破长的依赖链。如果您的作业有很长的转换链,Spark 会重新计算整个依赖链。这些操作可能会减慢处理速度。将复杂的作业分解为较小的任务。如果需要,保留中间结果。这样可以减少重新计算开销,并帮助您单独调试和监控每个步骤的性能。

减少网络延迟和 I/O 操作。向诸如 Amazon Simple Storage Service (Amazon S3)、Amazon Relational Database Service (Amazon RDS) 或 Amazon Redshift 等外部来源读取和写入数据会带来延迟,对于大型数据集尤其如此。使用 AWS Glue 的内置连接器。以支持更快读写的格式存储数据,例如 Parquet 或 ORC。启用 S3 Transfer Acceleration 以提高数据传输速率,并使用 AWS Glue Data Catalog 优化元数据检索。

优化本机操作。Glue 本机操作(包括作业书签DynamoDB 导出连接器)可以增加 AWS Glue 作业的运行时。要检查运行时,请在驱动程序日志中确定 AWS Glue 作业何时开始,以及将作业加入书签或从 DynamoDB 导出的任务何时结束。对于 DynamoDB,请检查是否有与以下示例类似的消息:

2024-08-24 03:33:37.000Z connections.DynamoExportConnection (DynamoExportConnection.scala:dynamodbexport(129)): Dynamodb Export complete...exported 712948751 item(s) or 4859215204353 byte(s)

减少作业书签的效果

  • 要减少扫描的文件数量,请将小文件合并为较大的文件。
  • 处理完成后,将分区移至存档位置。
  • 使用高效的分区策略,以便 AWS Glue 可以跳过未更改的整个分区。
  • 要尽早筛选数据,请使用下推谓词。
  • 如果作业书签不能为作业流程增加价值,请暂时将其关闭。

降低 DynamoDB 连接器的影响

  • 如果可能,请减少导出的数据量。
  • 要确定导致导出延迟的问题,请监控 DynamoDB 和 AWS Glue。
  • 要加快导出速度,请优化 DynamoDB 表配置。
  • 在可行的情况下,在主作业之外导出数据,或调整计划以避免出现瓶颈。

相关信息

在 AWS Glue 作业中使用作业参数

使用 Apache Spark Web UI 监控作业

Monitoring for DPU capacity planning

AWS 官方
AWS 官方已更新 2 个月前