零保留真空處理會導致數據丟失

在Databricks Runtime 8.0及以上版本中使用varchar類型。它隻能在表模式中使用。它不能在函數或運算符中使用。

寫的DD沙瑪

最後發布時間:2022年5月10日

問題

向Delta表添加數據,但數據會毫無警告地消失。沒有明顯的錯誤消息。

導致

這可能發生在spark.databricks.delta.retentionDurationCheck.enabled被設置為而且真空配置為保留0小時。

%sql VACUUM 保留0小時

真空配置為保留0小時,它可以刪除不屬於被抽真空的版本的任何文件。這包括已提交的文件、未提交的文件和用於並發事務的臨時文件。

考慮下麵的時間軸示例:

  • 真空在版本100上01:17 UTC開始運行。
  • 名為sample-data-part-0-1-2的數據文件。parquet在UTC 01:18添加到版本101。
  • 版本101在UTC 01:19提交。
  • 真空仍然運行在版本101上,並刪除sample-data-part-0-1-2。在協調世界時01:20拚花。
  • 真空於UTC 01:22完成。

在這個例子中,VACUMM在版本100上執行,並刪除了添加到版本101的所有內容。

解決方案

  • Databricks建議您設置一個真空保留間隔至少為7天,因為舊的快照和未提交的文件仍然可以被表的並發讀取者或寫入者使用。
  • 不設置spark.databricks.delta.retentionDurationCheck.enabled在Spark配置中設置為false。
  • 如果你設置spark.databricks.delta.retentionDurationCheck.enabled在你的Spark配置中設置為false,你必須選擇一個比最長運行的並發事務和任何流滯後於表的最新更新的最長時間都要長的時間間隔。

查看Databricks VACUMM文檔了解更多信息。