为什么我的 AWS Glue ETL 任务会运行很长时间?

3 分钟阅读
0

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

简短描述

AWS Glue 任务可能需要很长时间才能完成的原因如下:

  • 大型数据集
  • 数据集中的数据分配不均
  • 执行程序之间的任务分配不均
  • 资源调配不足

解决方法

启用指标

AWS Glue 会使用 Amazon CloudWatch 指标来提供有关执行程序的信息,例如提供每个执行程序的工作量。当您使用 AWS Glue 3.0 或更高版本时,您还可以使用 AWS Glue 无服务器 Spark UI 和可观察性指标。有关更多信息,请参阅为 Turning on the Apache Spark web UI for AWS Glue jobsMonitoring with AWS Glue Observability metrics

要为 AWS Glue 任务启用 CloudWatch 指标,可以使用特殊参数、AWS Glue 控制台或 API。

使用特殊参数

将以下参数添加到您的 AWS Glue 任务中:

Key: --enable-metrics

**注意:**enable-metrics 参数可以收集任务运行的任务分析指标。这些指标可在 AWS Glue 控制台和 CloudWatch 控制台上找到。

使用 AWS Glue 控制台

完成以下步骤:

  1. 打开 AWS Glue 控制台
  2. 在导航窗格中,选择任务
  3. 选择要启用指标的任务。
  4. 选择操作,然后选择编辑任务
  5. 监控选项下,选择任务指标
  6. 选择保存

使用 API

使用带 --enable-metrics 的 AWS Glue UpdateJob API 作为 DefaultArguments 参数。

**注意:**AWS Glue 2.0 不使用报告指标的 YARN,因为无法获得某些执行程序指标,例如 numberMaxNeededExecutorsnumberAllExecutor

启用连续日志记录

如果为 AWS Glue 任务启用连续日志记录,则实时驱动程序和执行程序日志每 5 秒会向 CloudWatch 推送一次。借助实时日志记录信息,您可以获得任务的更多详细信息。有关更多信息,请参阅 Turning on continuous logging for AWS Glue jobs

检查驱动程序和执行程序日志

在驱动程序日志中,检查是否存在运行很长时间才完成的任务。在以下示例中,一项任务花了 77 分钟才完成:

2021-04-15 10:53:54,484 ERROR executionlogs:128 - g-7dd5eec38ff57a273fcaa35f289a99ecc1be6901:2021-04-15 10:53:54,484 INFO [task-result-getter-1] scheduler.TaskSetManager (Logging.scala:logInfo(54)): Finished task 0.0 in stage 7.0 (TID 139) in 4538 ms on 10.117.101.76 (executor 10) (13/14)
...
2021-04-15 12:11:30,692 ERROR executionlogs:128 - g-7dd5eec38ff57a273fcaa35f289a99ecc1be6901:2021-04-15 12:11:30,692 INFO [task-result-getter-3] scheduler.TaskSetManager (Logging.scala:logInfo(54)): Finished task 13.0 in stage 7.0 (TID 152) in 4660742 ms on 10.117.97.97 (executor 11) (14/14)

要查看完成任务需要很长时间的原因,请使用 Apache Spark web UI。

启用 Spark UI

通过启动 Spark 历史服务器并打开 Spark UI 日志,可以获取有关日志阶段和任务的信息。通过日志了解工件如何运行任务。有关更多信息,请参阅 Turning on the Apache Spark web UI for AWS Glue jobs

**注意:**如果您使用 AWS 命令行界面(AWS CLI)打开 Spark UI,请确保使用最新的 AWS CLI 版本。如果在运行 AWS CLI 命令时收到错误,请参阅排查 AWS CLI 错误

任务完成后,您可能会看到与以下示例类似的驱动程序日志:

ERROR executionlogs:128 - example-task-id:example-timeframe INFO [pool-2-thread-1] s3n.MultipartUploadOutputStream (MultipartUploadOutputStream.java:close(414)): close closed:false s3://dox-example-bucket/spark-application-1626828545941.inprogress

使用 Amazon Elastic Compute Cloud (Amazon EC2) 实例或 Docker 启动 Spark 历史服务器。打开用户界面,导航到 Executor 选项卡,检查是否存在运行了很长时间的执行程序。如果存在某执行程序运行了很长时间,则数据集中的偏斜可能会导致任务分布不均和资源未得到充分利用。在 Stages 选项卡下,查看用时较长的阶段的信息和统计数据。

DPU 的容量规划

如果所有执行程序的任务量相同,但任务仍然需要很长时间才能完成,则可以向任务增加工件以提高速度。数据处理单元 (DPU) 容量规划有助于避免出现以下问题:

  • 配置不足可能会导致执行时间变慢
  • 过度配置会产生更高的成本,但产出结果的时间相同

通过 CloudWatch 指标,您可以了解当前使用的执行程序数量和所需的最大执行程序数量。所需的 DPU 数量取决于输入分区的数量和请求的工件类型。

您使用的 Amazon Simple Storage Service (Amazon S3) 文件类型和数据类型决定了您定义的分区数量:

  • 如果 Amazon S3 文件无法拆分,则分区数等于输入文件数。
  • 如果 Amazon S3 文件可以拆分,且数据为非结构化或半结构化,则分区数等于文件大小除以 64 MB。如果各文件大小小于 64 MB,则分区数等于文件数。
  • 如果 Amazon S3 文件可以拆分,且数据为结构化,则分区数等于总文件大小除以 128 MB。

请参阅以下示例,计算最优 DPU 数量。在此示例中,输入分区的数量为 240。使用以下公式计算最优 DPU 数量:

所需的最大执行程序数 = 输入分区数 / 各执行程序的任务数

**注意:**对于具有 G1.X 工件类型的 Glue 2.0 及更早版本,所需的最大执行程序数等于 240 除以 8。结果为 30。对于具有 G1.X 工件类型的 Glue 3.0 及更高版本,所需的最大执行程序数等于 240 除以 4。结果为 60。

为 AWS Glue 3.0 或更高版本规划 DPU 容量时,请为各执行程序使用支持所需任务数量的工件类型。每种工件类型支持的执行程序任务数量不同:

  • 标准工件类型支持每个执行程序运行 4 个任务。

  • G.1X 支持每个执行程序运行 4 个任务。

  • G.2X 支持每个执行程序运行 8 个任务。

  • G.4X 支持每个执行程序运行 16 个任务。

  • G.8X 支持每个执行程序运行 32 个任务。

Glue 2.0 及更早版本示例

对于 G1.X 工件类型,一个工件对应一个执行程序,一个 Glue 任务有一个驱动节点。根据以下示例,需要 30 个执行程序:
所需的 DPU 数量 =(执行程序数量 / 各节点的执行程序数量)+ 1 DPU = (30/1) + 1 = 31

Glue 3.0 及更高版本示例

对于 G1.X 工件类型,一个工件对应一个执行程序,一个 Glue 任务有一个驱动节点。根据以下示例,需要 60 个执行程序。
所需的 DPU 数量 =(执行程序数量 / 各节点的执行程序数量)+ 1 DPU = (60/1) + 1 = 61

相关信息

AWS Glue job parameters

Monitoring jobs using the Apache Spark web UI

Monitoring for DPU capacity planning

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