How to Use Iceberg rewrite_data_files with Spark on AWS
本文主要針對在 AWS 上使用 AWS Glue 和 Amazon EMR Serverless 的 Apache Spark 執行 Apache Iceberg rewrite_data_files 程序的時候會遇到的 No space left on device 進行疑難排解。以下是 Iceberg/Spark rewrite_data_files 的 Glue/Spark 測試範例 (特別設定了 rewrite-all
來進行測試,生產環境的話則應該不需要此參數)。
1 | import sys |
Why No space left on device during rewriting
由於尚未找到相關文件在描述 Iceberg/Spark 在 rewrite 時期的細節,但是經由錯誤訊息、硬碟觀察和 Spark UI 可以發現在執行的時候 Apache Spark 會將資料暫存 (cache),所以如果記憶體或硬碟不夠大的話就會跑出這個錯誤訊息。
解決 No space left on device 的方法可以是:
- 一直加機器
- 用更大的硬碟或比較便宜的 Amazon S3 來暫存 (本益比高)
AWS Glue
AWS Glue 使用 Amazon S3 當作 Shuffle storage (部落格文章)。以下是啟用 Amazon S3 當作 Shuffle storage 後的 Glue Job 設定範例: aws glue get-job
,要注意的就是範例中的 "--write-shuffle-files-to-s3": "true"
1 | { |
Amazon EMR Serverless
在 Amazon EMR Serverless 則提供了 Shuffle 專用的硬碟,具體設定可以參考官方文件,以下是設定後的參考 aws emr-serverless get-application
,需要注意的是要設定了 "diskType": "SHUFFLE_OPTIMIZED"
之後才能調大 disk。
1 | { |