為什麼我的 AWS Glue ETL 作業失敗,並顯示錯誤「容器因超出記憶體限制而被 YARN 刪除」?

2 分的閱讀內容
0

我的 AWS Glue 擷取、轉換和載入 (ETL) 作業失敗,並顯示「容器因超出記憶體限制而被 YARN 刪除」的錯誤訊息。

簡短描述

導致此錯誤的最常見原因如下:

  • 記憶體密集型作業,例如聯結大型資料表或處理具有偏斜特定資料欄值分佈的資料集,超過基礎 Spark 叢集的記憶體閾值
  • 消耗的記憶體超過分配給相應執行器的記憶體時資料的 Fat 分割區
  • 無法拆分的大型檔案導致記憶體分割區大

解決方法

使用下列一或多種解決方法來解決此錯誤:

  • 將具有更高記憶體組態的 Worker 類型從 G.1x 升級為 G.2x。如需 Worker 類型規格的詳細資訊,請參閱定義 Spark 作業的作業屬性中的 Worker 類型一節。
  • 若要進一步了解從 AWS Glue 2.0 移轉到 3.0 的相關資訊,請參閱從 AWS Glue 2.0 移轉到 AWS Glue 3.0
  • 您也可以檢閱下列資料表,以獲取 Worker 類型規格的相關資訊:
AWS Glue 版本 1.0 和 2.0
標準spark.executor.memory: 5g spark.driver.memory: 5g spark.executor.cores: 4
G.1xspark.executor.memory: 10g spark.driver.memory: 10g spark.executor.cores: 8
G.2xspark.executor.memory: 20g spark.driver.memory: 20g spark.executor.cores: 16
AWS Glue version 3.0
標準spark.executor.memory: 5g spark.driver.memory: 5g spark.executor.cores: 4
G.1xspark.executor.memory: 10g spark.driver.memory: 10g spark.executor.cores: 4
G.2xspark.executor.memory: 20g spark.driver.memory: 20g spark.executor.cores: 8
  • 如果升級 Worker 類型後錯誤仍然存在,請增加作業的執行器數量。每個執行器都有一定數量的內核。這個數字決定了執行器可以處理的分割區數量。資料處理單元 (DPU) 的 Spark 組態會根據 Worker 類型定義。
  • 請確定資料已正確並行化,以便在任何隨機操作 (例如連接) 之前均勻地使用執行器。您可以在所有執行器中重新分割資料。您可以在 ETL 作業中分別包含下列適用於 AWS Glue DynamicFrame 和 Spark DataFrame 的命令。
dynamicFrame.repartition(totalNumberOfExecutorCores)

dataframe.repartition(totalNumberOfExecutorCores)
  • 使用作業書籤只允許 AWS Glue 作業處理新寫入的檔案。這樣可減少 AWS Glue 作業處理的檔案數量,並減少記憶體問題。書籤會儲存前一次執行中所處理之檔案的相關中繼資料。在後續執行中,作業會比較時間戳記,然後決定是否再次處理這些檔案。如需詳細資訊,請參閱使用作業書籤追蹤已處理的資料
  • 根據預設,連線到 JDBC 資料表時 Spark 只開啟一個並發連線。驅動程式嘗試在單個 Spark 執行器中一次下載整個資料表。這可能需要更長的時間,甚至導致執行器的記憶體不足錯誤。相反,您可以設定 JDBC 資料表的特定屬性,以指示 AWS Glue 透過 DynamicFrame 並行讀取資料。如需詳細資訊,請參並行讀取 JDBC 資料表。或者,您可以透過 Spark DataFrame 從 JDBC 實現並行讀取。如需詳細資訊,請參閱 JDBC 的 Spark DataFrame 並行讀取並檢閱屬性,例如: partitionColumnlowerBoundupperBoundnumPartitions
  • 避免在 ETL 作業中使用使用者定義的函數,尤其是在將 Python/Scala 程式碼與 Spark 的函式和方法結合使用時。例如:避免使用 Spark 的 df.count() 驗證 if/else 陳述中或 for 循環中的空 DataFrames。而應使用效能更好的函式,例如: df.schema()df.rdd.isEmpty()
  • 開發端點上測試 AWS Glue 作業,並相應地最佳化 ETL 程式碼。
  • 如果上述解決方法都不起作用,請將輸入資料分割成區塊或分割區。然後,執行多個 AWS Glue ETL 作業,而不是執行一個大型作業。如需詳細資訊,請參閱限定執行的工作負載分割

相關資訊

對 OOM 例外和作業異常偵錯

使用 AWS Glue 擴展 Apache Spark 作業和分割資料的最佳作法

最佳化 AWS Glue 中的記憶體管理

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