我的 AWS Glue 擷取、轉換和載入 (ETL) 作業失敗,並顯示「容器因超出記憶體限制而被 YARN 刪除」的錯誤訊息。
簡短描述
導致此錯誤的最常見原因如下:
- 記憶體密集型作業,例如聯結大型資料表或處理具有偏斜特定資料欄值分佈的資料集,超過基礎 Spark 叢集的記憶體閾值
- 消耗的記憶體超過分配給相應執行器的記憶體時資料的 Fat 分割區
- 無法拆分的大型檔案導致記憶體分割區大
解決方法
使用下列一或多種解決方法來解決此錯誤:
| |
---|
AWS Glue 版本 1.0 和 2.0 | |
標準 | spark.executor.memory: 5g spark.driver.memory: 5g spark.executor.cores: 4 |
G.1x | spark.executor.memory: 10g spark.driver.memory: 10g spark.executor.cores: 8 |
G.2x | spark.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.1x | spark.executor.memory: 10g spark.driver.memory: 10g spark.executor.cores: 4 |
G.2x | spark.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 並行讀取並檢閱屬性,例如: partitionColumn、lowerBound、upperBound 和 numPartitions。
- 避免在 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 中的記憶體管理