問題
在進行寫入操作時,遇到網絡問題(或類似問題)。您正在重新運行作業,但是在失敗的運行期間部分未提交的文件將導致不必要的數據複製。
導致
Databricks提交協議的工作原理:
- DBIO提交協議(AWS|Azure|GCP)是事務性的。隻有在事務成功完成後才提交文件。如果作業在事務中間失敗,則僅_started_ < id >存儲其他部分寫入的數據文件。
- 當作業重新運行時,一個新的_started_ < id >文件創建完成。一旦交易成功完成,一個新的_committed_ < id >生成文件。這_committed_ < id >file是一個JSON文件,包含上遊讀取的所有parquet文件名。
- 如果您使用Apache Spark讀取文件夾,則沒有重複,因為它隻讀取其中的文件_committed_ < id >.
- 要從目標路徑刪除未提交的數據文件,運行DBIO真空每次工作結束的時候。默認情況下,超過48小時(2天)未提交的文件將被刪除。
問題發生時:
- 如果在作業失敗後的兩天內讀取文件夾,請使用其他工具(不使用DBIO或Spark)或使用通配符(spark.read.load (' / path / *)),將讀取所有文件,包括未提交的文件。這會導致數據複製。
解決方案
理想的解決方案是僅使用Spark或DBIO訪問文件存儲。
如果必須為其他工具保留訪問權限,則應該更新的值spark.databricks.io.directoryCommit.vacuum.dataHorizonHours在您的集群中火花配置(AWS|Azure|GCP).
你也可以在筆記本中更新這個屬性:
spark.conf.set(“spark.databricks.io.directoryCommit.vacuum.dataHorizonHours”、“<時間>”)
此屬性確定當自動真空在每個作業結束時運行。任何早於指定時間的文件都將被刪除。
默認值為48小時(2天)。根據您的具體需求,您可以將此時間縮短至1小時。如果您將該值設置為1小時,則自動真空在每個作業結束時刪除任何超過一小時的未提交文件。
或者,您可以在重新運行失敗的作業後手動運行VACUUM保留時間值低到足以刪除部分未提交的文件。
請參閱真空(AWS|Azure|GCP)文件,以獲取更多資料。
參見真空文檔:https://docs.www.eheci.com/spark/latest/spark-sql/language-manual/delta-vacuum.html