为什么我的 AWS Glue ETL 任务会运行很长时间?
我的 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 jobs 和 Monitoring with AWS Glue Observability metrics。
要为 AWS Glue 任务启用 CloudWatch 指标,可以使用特殊参数、AWS Glue 控制台或 API。
使用特殊参数
将以下参数添加到您的 AWS Glue 任务中:
Key: --enable-metrics
**注意:**enable-metrics 参数可以收集任务运行的任务分析指标。这些指标可在 AWS Glue 控制台和 CloudWatch 控制台上找到。
使用 AWS Glue 控制台
完成以下步骤:
- 打开 AWS Glue 控制台。
- 在导航窗格中,选择任务。
- 选择要启用指标的任务。
- 选择操作,然后选择编辑任务。
- 在监控选项下,选择任务指标。
- 选择保存。
使用 API
使用带 --enable-metrics 的 AWS Glue UpdateJob API 作为 DefaultArguments 参数。
**注意:**AWS Glue 2.0 不使用报告指标的 YARN,因为无法获得某些执行程序指标,例如 numberMaxNeededExecutors 和 numberAllExecutor。
启用连续日志记录
如果为 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 官方已更新 3 年前
- AWS 官方已更新 10 个月前
- AWS 官方已更新 3 年前