Get Hands-on with Amazon EKS - Workshop Event Series
Whether you're taking your first steps with Kubernetes or you're an experienced practitioner looking to sharpen your skills, our Amazon EKS workshop series delivers practical, real-world experience that moves you forward. Learn directly from AWS solutions architects and EKS specialists through hands-on sessions designed to build your confidence with Kubernetes. Register now and start building with Amazon EKS!
如何解決 AWS Glue ETL 工作中的「裝置上沒有剩餘空間」錯誤?
我想避免在執行 AWS Glue ETL 工作時收到「裝置上沒有剩餘空間」的錯誤。
簡短描述
執行 AWS Glue 擷取、轉換和載入 (ETL) 工作時,可能會收到下列類型的錯誤:
- 工作因階段失敗而中止: 階段 158.0 中的任務 68 失敗了 4 次,最近的失敗: 在階段 158.0 中遺失了任務 68.3 (TID 28820,10.102.100.111,執行程式 17):org.apache.spark.memory.SparkOutOfMemoryError:在 org.apache.spark.shuffle.sort.ShuffleExternalSorter@55f6dabb 上呼叫 spill() 時發生錯誤: 裝置上沒有剩餘空間
-或-
- 工作因階段失敗而中止: ResultStage 7 失敗的次數達到允許的最大次數: 4。最近的失敗原因:org.apache.spark.shuffle.MetadataFetchFailedException: 遺失隨機排序 2 的輸出位置
Apache Spark 使用 AWS Glue 工作者上的本機磁碟,從超出 spark.executor.memory 組態參數所定義堆積空間的記憶體中溢出資料。
如 groupByKey()、reduceByKey() 和 join() 等廣泛轉換可能會導致隨機排序。在工作的排序或隨機排序階段期間,Spark 會先將中繼資料寫入本機磁碟,然後在不同工作者之間交換該資料。此時,您可能會收到「裝置上沒有剩餘空間」或 MetadataFetchFailedException 錯誤。當執行程式上沒有足夠的剩餘磁碟空間而無法復原時,Spark 會擲出此錯誤。
解決方法
當處理工作觀察到資料集中出現明顯的扭曲時,通常會發生這些類型的錯誤。本節列出一些常見的監控和偵錯異常,以及解決這些異常的方法。
AWS Glue 工作指標和 Apache Spark UI 是功能強大的工具,可用來監控 Apache Spark 執行程式中的資料扭曲。透過監控實作時間表,此工具可讓您輕鬆識別可能導致資料扭曲的任何問題。這可以協助您詳細了解每個階段、任務、工作和執行程式的行為。
分解運算和儲存
此方法可為大型隨機排序擴展儲存體,而不是將資料寫入 AWS Glue 工作者的本機磁碟。
**使用專用的無伺服器儲存體:**AWS Glue 2.0 或更新版本可讓您使用 Amazon Simple Storage Service (Amazon S3) 來儲存 Spark 隨機排序和溢出資料。
AWS Glue 2.0 利用下列工作參數來使用 AWS Glue 中的 Amazon S3 隨機排序。如需詳細資訊,請參閱 AWS Glue Spark 隨機排序外掛程式與 Amazon S3。
- 鍵:--write-shuffle-files-to-s3
**值:**TRUE - 鍵:--write-shuffle-spills-to-s3
**值:**TRUE - 鍵:--conf
**值:**spark.shuffle.glue.s3ShuffleBucket=s3://custom_shuffle_bucket
**注意:**選用旗標 spark.shuffle.glue.s3ShuffleBucket 指定隨機排序檔案寫入目標的 Amazon S3 儲存貯體。請將 custom_shuffle_bucket 取代為 S3 儲存貯體的名稱。
AWS Glue 3.0/4.0 利用下列工作參數來使用 Apache Spark 的雲端隨機排序儲存外掛程式。如需詳細資訊,請參閱 Apache Spark 的雲端隨機排序儲存外掛程式。
- 鍵:--write-shuffle-files-to-s3
**值:**TRUE - 鍵:--conf
**值:**spark.shuffle.storage.path=s3://custom_shuffle_bucket
**注意:**選用旗標 spark.shuffle.storage.path 指定隨機排序檔案寫入目標的 Amazon S3 儲存貯體。請將 custom_shuffle_bucket 取代為 S3 儲存貯體的名稱。
橫向擴展
橫向擴展是指透過水平擴展增加工作者的數目,或透過垂直擴展升級工作者類型。但是,橫向擴展不一定總是有效,特別是如果您的資料在幾個鍵上嚴重扭曲時。若要解決資料扭曲問題,請考慮透過實作 salt 處理技術來修改 Apache Spark 應用程式邏輯。
減少和篩選輸入資料
盡可能預先篩選輸入資料,以便在廣泛操作期間將資料隨機排序情況和網路用量降至最低。請使用下列技術進行有效的資料篩選:
- AWS Glue 推入述詞
- AWS Glue 限定執行的工作負載分割
- 用於篩選的 AWS Glue exclusions
廣播小型表格
在 Apache Spark 中加入表格可能會在不同工作者的執行程式之間觸發資料隨機排序和大量資料移動作業。這可能會造成系統記憶體不足,並將資料溢出到工作者的磁碟上。為了將網路的額外負荷降至最低,Spark 支援使用較小的表格進行廣播。這些表格不超過數十 MB (百萬位元組),並防止資料進行分割和隨機排序。透過提供提示給 Spark 即可使用較小的表格進行廣播。如需詳細資訊,請參閱 AWS 部落格優化 AWS Glue 中的記憶體管理中的廣播小型表格。
使用 AQE
來自 Databricks 的自適性查詢執行 (AQE) 是 Spark SQL 中的優化技術。其使用執行階段統計資料來選擇最有效的查詢實作計畫,以解決每個階段的資料扭曲和動態隨機排序分區問題。AWS Glue 3.0/4.0 中預設提供 AQE。
AQE 執行下列功能:
-
動態聯合隨機排序分區
視需要在每個查詢階段之後自動聯合分區,並解決分區管理問題。如需詳細資訊,請參閱動態聯合隨機排序分區,其位於 Databricks 網站上的自適性查詢執行: 在執行階段加快 Spark SQL 的速度中。
**– 分區太少:**自動分割因資料過多導致溢出到本機磁碟的分區。
**– 分區太多:**視需要自動合併分區。當每個分區的資料大小很小且需要進行小型網路資料擷取才能讀取隨機排序區塊時,就會合併分區。 -
動態切換加入策略
根據每個階段中的表格大小統計資料,將排序合併轉換為廣播雜湊聯結。 -
動態優化扭曲聯結
自動偵測並優化隨機排序檔案統計資料中的扭曲聯結。AQE 會將扭曲的分區分割成較小的子分區。接著將這些較小的分區聯結到另一個節點中的對應分區。如需詳細資訊,請參閱動態優化扭曲聯結,其位於 Databricks 網站上的自適性查詢執行: 在執行階段加快 Spark SQL 的速度中。
設定 AQE
使用下列工作參數來開啟 AQE:
- 鍵:--conf
**值:**spark.sql.adaptive.enabled=true --conf spark.sql.adaptive.coalescePartitions.enabled=true --conf spark.sql.adaptive.skewJoin.enabled=true
相關內容
- 已提問 2 年前
- 已提問 8 個月前
- 已提問 1 年前
