問題
你有一個網絡問題(或類似的),一個寫操作是在進步。你重新運行工作,但部分未提交的文件在運行造成不必要的數據重複失敗。
導致
磚提交協議的工作原理:
- 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天)。你可以減少一小時,這取決於您的具體需求。如果你將值設置為一個小時,自動的真空刪除所有未提交的文件超過一個小時的每一份工作。
或者,您可以手動運行真空後重新運行失敗的工作保留時間價值足夠低的部分未提交的文件. .
看到真空文檔:https://docs.m.eheci.com/spark/latest/spark-sql/language-manual/delta-vacuum.html