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

部分未提交的文件從一個失敗的寫會導致明顯的數據重複。調整真空設置來解決這個問題。

寫的gopinath.chandrasekaran

去年發表在:2022年11月8日

問題

你有一個網絡問題(或類似的),一個寫操作是在進步。你重新運行工作,但部分未提交的文件在運行造成不必要的數據重複失敗。

導致

磚提交協議的工作原理:

  • DBIO提交協議(AWS|Azure|GCP)事務。文件隻提交一個事務成功完成後。如果工作失敗的事務,_started_ < id >和其他部分寫數據文件存儲。
  • 重新運行工作時,一個新的_started_ < id >創建文件。一旦交易成功完成一個新的_committed_ < id >文件生成。這_committed_ < id >文件是一個JSON文件,其中包含所有的拚花由上遊要讀取的文件名。
  • 如果你讀的文件夾使用Apache火花沒有重複,因為它隻有讀取裏麵的文件_committed_ < id >
  • 刪除未提交的數據文件的目標路徑,DBIO運行真空在每一份工作。默認情況下,未提交的文件超過48小時(2天)移除。

當問題發生時:

  • 在兩天內如果你讀文件夾失敗的工作,使用另一個工具(不使用DBIO或火花)或讀取文件夾通配符(spark.read.load (' / path / *)),讀取所有文件,包括未提交的文件。這導致數據重複。

解決方案

理想的解決方案是隻使用火花或DBIO訪問文件存儲。

如果你必須保存訪問其他工具,您應該更新的價值spark.databricks.io.directoryCommit.vacuum.dataHorizonHours在集群的火花配置(AWS|Azure|GCP)。

你也可以更新這個屬性在一個筆記本:

spark.conf.set (“spark.databricks.io.directoryCommit.vacuum.dataHorizonHours”、“<時間>”)

這個屬性決定了哪些文件時自動刪除真空運行結束時,每一份工作。刪除任何文件超過指定的時間。

默認值是48小時(2天)。你可以減少一小時,這取決於您的具體需求。如果你將值設置為一個小時,自動的真空刪除所有未提交的文件超過一個小時的每一份工作。

或者,您可以手動運行真空後重新運行失敗的工作保留時間價值足夠低的部分未提交的文件. .

請檢查真空(AWS|Azure|GCP)文檔了解更多信息。

看到真空文檔:https://docs.m.eheci.com/spark/latest/spark-sql/language-manual/delta-vacuum.html

刪除

警告

運行真空保留時間設置為0會導致數據一致性問題。如果其他任何火花工作寫文件到這個文件夾,運行真空保持0小時刪除這些文件。一般來說,真空不應該有保留時間值小於1



這篇文章有用嗎?