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

3 分的閱讀內容
0

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

解決方法

可能導致 AWS Glue 工作長時間執行的常見因素包括組態設定以及資料和指令碼的結構。

以下步驟有助於最佳化效能。

設定指標和記錄

若要識別問題並最佳化效能,請使用 AWS Glue 的整合式監控工具,例如 Amazon CloudWatch工作可觀測性指標

此外,還可以設定異常警示,並開啟 Apache Spark UI,以更深入了解 AWS Glue 工作的運作。您可以使用 AWS Glue 工作執行洞察功能,來詳細了解工作執行時的行為。

若要啟動指標,請完成以下其中一項操作。

從 AWS Glue 主控台

  1. 開啟 AWS Glue 主控台
  2. 在導覽窗格中,選擇 ETL Jobs (工作)。
  3. 選取您想要啟用指標的工作。
  4. 選擇 Action (動作),然後選擇 Edit job (編輯工作)。
  5. 在「工作詳細資訊」標籤的「進階」選項下,選擇 Job metrics (工作指標)、Job observability metrics (工作可觀測性指標)、Continuous logging (連續記錄) 和 Spark UI
  6. 選擇 Save (儲存)。

從 CLI 或 SDK

**注意事項:**如果您在執行 AWS Command Line Interface (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 及更新版本可以使用 Spark 原生功能 (例如自適應查詢執行 (AQE)) 來處理扭曲聯結。如需詳細資訊,請參閱 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 工作者可能必須處理大型、不平衡的分區。這樣的處理時間會導致延遲。若要控制分區的數量,請使用 Spark 中的 repartition() 或 coalesce() 函數。確保您的資料分割良好,以利用 Spark 的分散性質。您也可以將 AWS Glue DynamicFrame 設定為使用 splitFields 或自訂分區索引鍵對資料進行分割。

透過新增工作節點來增加容量。如果沒有足夠的工作節點來處理資料量,那麼工作就會因為平行處理能力有限而運作緩慢。增加工作節點的數量,或切換到較大的工作者類型。確保您使用正確的工作者大小,並設定了足夠的 DPU (資料處理單元) 來有效率地處理資料。每個執行程式處理的任務數等於 DPU 數量的四倍。例如,G.1X 工作者類型有一個 DPU,並且每個執行者處理四個任務。請注意,G.4X 和 G.8X 工作者類型僅適用於 AWS Glue 3.0 版或更新版本的 Spark ETL 工作。

重新分配資料以減少分區間的扭曲。當分區間的資料量有明顯差異時,就會發生資料扭曲。具有更多資料的節點會過度工作,而其他節點處於閒置狀態。透過分析資料分佈來識別扭曲的索引鍵。在分區間重新分配或平衡資料,或使用鹽化技術分散熱鍵。AWS Glue 3.0 及更新版本可以使用 Apache 網站上的 Spark 原生功能 (例如自適應查詢執行 (AQE)) 來處理扭曲聯結。若要這麼做,請開啟自適應查詢執行 (AQE) 並將 spark.sql.adaptive.skewJoin.enabled 設為 True。從 spark 3.2.0 開始,預設會開啟AQE。若要開啟 Glue 3.0 的 AQE,請新增參數 spark.sql.adaptive.enabled,並將其設為 True。

使用原生 Spark 函數取代 UDF。自訂使用者定義函數 (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 傳輸加速以提高資料傳輸速率,並使用 AWS Glue 資料目錄來最佳化中繼資料擷取。

最佳化原生作業。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 監控工作

監控 DPU 容量規劃

AWS 官方
AWS 官方已更新 3 個月前