使用 vacuum 移除未使用的資料檔案

您可以藉由在數據表上執行 VACUUM 命令,移除 Delta 數據表不再參考超過保留閾值的數據檔。 由於下列考慮,定期執行 VACUUM 對於成本和合規性很重要:

  • 刪除未使用的數據檔可降低雲端記憶體成本。
  • 拿掉的 VACUUM 資料檔可能包含已修改或刪除的記錄。 從雲端記憶體永久移除這些檔案可確保這些記錄無法再存取。

執行 VACUUM 後數據文件的預設保留閾值為 7 天。 若要變更此行為,請參閱 設定時間旅行查詢的數據保留期。

Databricks 建議使用預測性優化自動針對 Delta 數據表執行 VACUUM 。 請參閱 Delta Lake 的預測優化。

某些 Delta Lake 功能會使用元資料檔案來將數據標示為已刪除,而不是重寫數據檔。 您可以使用 REORG TABLE ... APPLY (PURGE) 來認可這些刪除並重寫資料檔。 請參閱 清除僅限元數據刪除以強制數據重寫

重要

  • 在 Databricks Runtime 13.3 LTS 和更新版本中, VACUUM 使用 Unity 目錄受控數據表進行淺層複製的語意與其他差異數據表不同。 請參閱 Vacuum 和 Unity 目錄淺層複製
  • VACUUM從 Delta Lake 未管理的目錄中移除所有檔案,忽略開頭為 或 ._目錄。 如果您要在 Delta 資料表目錄中儲存其他元資料,例如結構化串流檢查點,請使用目錄名稱,例如 _checkpoints
    • 變更數據摘要的數據是由目錄中的 Delta Lake _change_data 管理,並使用 VACUUM移除。 請參閱 在 Azure Databricks 上使用 Delta Lake 變更數據摘要。
    • Bloom 篩選索引會使用 _delta_index Delta Lake 管理的目錄。 VACUUM 清除此目錄中的檔案。 請參閱 Bloom 篩選索引
  • 執行 之後 VACUUM,查詢早於保留期間之數據表版本的能力會遺失。
  • 記錄檔會在檢查點作業之後自動和異步刪除,且不受控管 VACUUM。 雖然記錄檔的預設保留期間是 30 天,但數據表上執行 VACUUM 會移除時間移動所需的數據檔。

注意

啟用磁碟快取時,叢集可能包含已使用 VACUUM刪除之 Parquet 檔案中的數據。 因此,可以查詢已刪除檔案的舊數據表版本數據。 重新啟動叢集將會移除快取的數據。 請參閱 設定磁碟快取

真空的範例語法

VACUUM eventsTable   -- vacuum files not required by versions older than the default retention period

VACUUM '/data/events' -- vacuum files in path-based table

VACUUM delta.`/data/events/`

VACUUM delta.`/data/events/` RETAIN 100 HOURS  -- vacuum files not required by versions more than 100 hours old

VACUUM eventsTable DRY RUN    -- do dry run to get the list of files to be deleted

如需Spark SQL語法詳細數據,請參閱 VACUUM

如需 Scala、Java 和 Python 語法詳細數據,請參閱 Delta Lake API 檔

注意

RETAIN使用 關鍵詞來指定用來判斷是否應該移除數據檔的臨界值。 VACUUM命令會使用此閾值來回頭查看指定時間量,並識別該時間點最新的數據表版本。 Delta 會保留查詢該數據表版本和所有較新數據表版本所需的所有數據檔。 此設定與其他數據表屬性互動。 請參閱 設定時間旅行查詢的數據保留。

清除僅限元數據的刪除以強制數據重寫

命令 REORG TABLE 提供 APPLY (PURGE) 重寫數據以套用虛刪除的語法。 虛刪除不會重寫資料或刪除資料檔,而是使用元數據檔案來指出某些數據值已變更。 請參閱 REORG 資料表

在 Delta Lake 中建立虛刪除的作業包括:

  • 卸除 已啟用數據行對應 的數據行。
  • 刪除已啟用刪除向量的數據
  • 啟用刪除向量時,在已啟用 Photon 的叢集上進行任何資料修改。

啟用虛刪除後,即使刪除或更新數據之後,舊數據仍可能實際存在於數據表的目前檔案中。 若要從數據表實際移除此數據,請完成下列步驟:

  1. 執行 REORG TABLE ... APPLY (PURGE)。 執行此動作之後,舊數據不再存在於數據表的 目前 檔案中,但仍存在於用於時間移動的較舊檔案中。
  2. 執行 VACUUM 以刪除這些較舊的檔案。

REORG TABLE 當作業完成時,會建立新版的數據表。 此交易之前歷程記錄中的所有數據表版本都是指較舊的數據檔。 從概念上講,這類似於 OPTIMIZE 命令,即使目前數據表版本中的數據保持一致,也會重寫數據檔。

重要

只有在檔案已根據VACUUM保留期間過期時,才會刪除數據檔。 這表示 VACUUM 必須在 之後 REORG 延遲完成 ,才能讓較舊的檔案過期。 的保留期間 VACUUM 可以減少以縮短所需的等候時間,代價是降低保留的最大歷程記錄。

真空需要何種大小叢集?

若要為 選取正確的叢集大小 VACUUM,它有助於了解作業會在兩個階段中發生:

  1. 作業會從使用所有可用的執行程序節點開始,以平行方式列出來源目錄中的檔案。 此清單會與 Delta 事務歷史記錄中目前參考的所有檔案進行比較,以識別要刪除的檔案。 此時,驅動程式會閑置。
  2. 驅動程式接著會針對要刪除的每個檔案發出刪除命令。 檔案刪除是僅限驅動程式的作業,這表示當背景工作節點閑置時,所有作業都會發生在單一節點中。

為了將成本和效能優化,Databricks 建議下列專案,特別是針對長時間執行的真空作業:

  • 針對 1-4 個背景工作角色設定自動調整集的叢集上執行真空,其中每個背景工作角色都有 8 個核心。
  • 選取 8 到 32 個核心之間的驅動程式。 增加驅動程式的大小,以避免記憶體不足 (OOM) 錯誤。

如果 VACUUM 作業會定期刪除超過 10,000 個檔案,或佔用 30 分鐘的處理時間,您可能會想要增加驅動程式的大小或背景工作角色數目。

如果您發現在識別要移除的檔案時發生速度變慢,請新增更多背景工作節點。 如果刪除命令執行時發生速度變慢,請嘗試增加驅動程式的大小。

您應該執行真空的頻率?

Databricks 建議定期在所有數據表上執行 VACUUM ,以減少多餘的雲端數據儲存成本。 真空的預設保留閾值為 7 天。 設定較高的閾值可讓您存取數據表的歷程記錄,但會增加所儲存的數據檔數目,因此,雲端提供者會產生更大的記憶體成本。

為什麼您無法使用低保留閾值來清空 Delta 數據表?

警告

建議您將保留間隔設定為至少 7 天,因為舊的快照集和未認可的檔案仍可供數據表的並行讀取器或寫入器使用。 如果 VACUUM 清除使用中檔案,並行讀取器可能會失敗,或者更糟的是,刪除尚未認可的檔案時 VACUUM ,數據表可能會損毀。 您必須選擇超過執行中最長並行交易的間隔,以及任何資料流程可以延遲至資料表最新更新的最長期間。

Delta Lake 有安全檢查,以防止您執行危險的 VACUUM 命令。 如果您確定此資料表上未執行比您計劃指定的保留間隔還要久的作業,您可以將 Spark 組態屬性 spark.databricks.delta.retentionDurationCheck.enabled 設定為 false來關閉此安全性檢查。

稽核資訊

VACUUM 認可至 Delta 事務歷史記錄包含稽核資訊。 您可以使用 查詢稽核事件 DESCRIBE HISTORY