為什麼我的 AWS Glue ETL 作業執行時間很長?

3 分的閱讀內容
0

我的 AWS Glue 作業執行時間很長。或者,我的 AWS Glue 拖延作業需要很長時間才能完成。

簡短說明

由於下列原因,您的 AWS Glue 作業可能需要很長時間才能完成:

  • 大型資料集
  • 資料集中的資料分佈不均勻
  • 在執行程式之間的任務分配不均勻
  • 佈建不足的資源

解決方法

開啟指標

AWS Glue 使用 Amazon CloudWatch 指標來提供關於執行程式的資訊,例如每個執行程式的工作量。在使用 AWS Glue 3.0 或更高版本時,您也可以使用 AWS Glue 無伺服器 Spark UI 和可觀測性指標。如需詳細資訊,請參閱開啟 AWS Glue 作業的 Apache Spark web UI使用 AWS Glue 可觀測性指標進行監控

若要為 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

使用 AWS Glue UpdateJob API,以 --enable-metricsDefaultArguments 參數。

**注意:**AWS Glue 2.0 不會使用報告指標的 YARN,因為您無法取得某些執行程式指標,例如 numberMaxNeededExecutorsnumberAllExecutor

開啟連續日誌記錄

如果您為 AWS Glue 作業開啟連續日誌記錄,則即時驅動程式和執行程式日誌每 5 秒鐘會推送至 CloudWatch。在使用即時日誌記錄資訊時,可以獲得關於作業的更多詳細資訊。如需詳細資訊,請參閱開啟 AWS Glue 作業的連續日誌記錄

檢查驅動程式和執行程序日誌

在驅動程式日誌中,檢查是否有任務長時間執行後才完成。在下列範例中,有一項任務需要 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 日誌時,您可以存取關於日誌的階段和任務的資訊。使用日誌來了解工作者如何執行任務。如需詳細資訊,請參閱開啟 AWS Glue 作業的 Apache Spark web UI

**注意:**如果您使用 AWS Command Line Interface (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 歷史記錄伺服器。開啟 UI,然後導覽至執行程式標籤以檢查特定執行程式是否長時間執行。如果執行程式長時間執行,則資料集中的扭曲可能會導致工作分佈不均勻以及資源使用不足。在階段標籤中,檢閱耗用時間長的階段的資訊和統計資料。

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 容量時,請使用支援每個執行程式所需任務數目的工作者類型。每個工作者類型支援不同的每個執行程式任務數:

  • 標準工作者類型支援每個執行程式四個任務。
  • G.1X 支援每個執行程式四個任務。
  • G.2X 支援每個執行程式八個任務。
  • G.4X 支援每個執行程式 16 個任務。
  • G.8X 支援每個執行程式 32 個任務。

Glue 2.0 及更早版本的範例

對於 Glue 作業,G1.X 工作者類型為每個工作者一個執行程式以及一個驅動程式節點。根據以下範例,您需要 30 個執行程式:
所需的 DPU 數目 =(執行程式數目/每節點的執行程式數目)+ 1 DPU = (30/1) + 1 = 31

Glue 3.0 及更高版本的範例

對於 Glue 作業,G1.X 工作者類型為每個工作者一個執行程式以及一個驅動程式節點。根據以下範例,您需要 60 個執行程式。
所需的 DPU 數目 =(執行程式數目/每節點的執行程式數目)+ 1 DPU = (60/1) + 1 = 61

相關資訊

AWS Glue 作業參數

使用 Apache Spark Web UI 監控作業

監控 DPU 容量規劃

AWS 官方
AWS 官方已更新 1 年前