未提交的文件導致數據重複

寫入失敗後部分未提交的文件可能導致明顯的數據複製。調整VACUUM設置以解決該問題。

寫的gopinath.chandrasekaran

最後發布時間:2022年11月8日

問題

在進行寫入操作時,遇到網絡問題(或類似問題)。您正在重新運行作業,但是在失敗的運行期間部分未提交的文件將導致不必要的數據複製。

導致

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

刪除

警告

運行真空保留時間設置為0可能導致數據一致性問題。如果有其他Spark作業正在將文件寫入此文件夾,則運行真空保留0小時刪除這些文件。一般來說,真空不應該有保留時間值小於1



這篇文章有用嗎?