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

透過在資料表上執行 VACUUM 指令,移除資料表中已不再被資料表參考且已超過保留閾值的資料檔案。 由於下列考慮,定期執行 VACUUM 對於成本和合規性很重要:

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

在啟用 Iceberg 讀取的資料表上, VACUUM 也會清理舊版本的 Iceberg 元資料。 請參閱 VACUUM和 Iceberg 中繼資料清理。

預測性優化會在 Unity 目錄受控數據表上自動執行 VACUUM。 Databricks 建議為所有 Unity 目錄受控數據表啟用預測優化,以簡化數據維護並減少記憶體成本。 請參閱 Unity Catalog 管理資料表的預測性優化。

真空的注意事項

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

VACUUM 從其中移除所有檔案之後,可能會留下空白目錄。 後續 VACUUM 作業會刪除這些空目錄。

部分表格功能,如刪除向量,使用元資料檔案標記資料為已刪除,而非重寫資料檔案。 使用REORG TABLE ... APPLY (PURGE)提交這些刪除並重寫資料檔案。 請參閱 清除僅限元數據以強制重寫數據。

Important

  • 在 Databricks Runtime 13.3 LTS 及以上版本中, VACUUM 使用 Unity 目錄管理資料表的淺層克隆語意與其他資料表不同。 請參見 Unity Catalog 淺層克隆的使用VACUUM。
  • VACUUM 會移除所有未由 Azure Databricks 管理的目錄中的檔案,忽略以 _ 或 . 開頭的目錄。 如果您在資料表目錄中儲存額外的元資料,例如結構化串流檢查點,請使用像_checkpoints這樣的目錄名稱。
  • 執行 VACUUM 之後,查詢早於保留期限的資料表版本的能力會消失。
  • 記錄檔會在檢查點作業之後自動和異步刪除,且不受控管 VACUUM。 雖然記錄檔的預設保留期間是 30 天,但數據表上執行 VACUUM 會移除時間移動所需的數據檔。
  • 啟用磁碟快取時,叢集可能包含已使用 VACUUM刪除之 Parquet 檔案中的數據。 因此,可以查詢已刪除檔案的舊數據表版本數據。 重新啟動叢集將會移除快取的數據。 請參閱 設定磁碟快取。

真空的範例語法

若要移除預設保留期間之前的較舊版本已不再需要的檔案,請在不需額外設定的情況下執行 VACUUM:

VACUUM table_name

若要預覽待刪除檔案清單而不移除它們,請執行 VACUUM 以下操作 DRY RUN:

VACUUM table_name DRY RUN

如需 Spark SQL 語法詳細資料,請參閱 VACUUM。

關於 Scala、Java 和 Python 語法的細節,請參閱 Delta Lake API 文件。

注意

在 Databricks Runtime 18.0 及以上版本中,使用 deletedFileRetentionDuration 表格屬性來控制保留。 對於 Unity Catalog 管理的資料表,這適用於 Databricks Runtime 12.2 LTS 及以上版本。

請參閱設定時光旅行查詢中的資料保留政策。

全模式與輕量模式

Important

此功能目前已在 Databricks Runtime 16.4 LTS 及以上版本的公開預覽版中。

為了藉由避免列出資料表目錄中的所有檔案來提升效能並降低成本,請在 VACUUM 陳述式中指定 LITE 關鍵字,以觸發 VACUUM 的替代模式。 這對於需要頻繁操作 VACUUM 的大型資料表非常有用。

LITE 模式利用交易日誌識別不再在保留閾值內 VACUUM 的資料檔案,並將這些資料檔案從資料表中移除。

注意

在 VACUUM 模式中執行 LITE 將不會刪除事務歷史記錄中未參考的任何檔案。 例如,由於交易中止而產生的檔案。

在 VACUUM 模式中使用下列語法來 LITE:

VACUUM table_name LITE

FULL 模式是真空的預設值。 您可以使用下列命令明確地執行完整模式:

VACUUM table_name FULL

參見 VACUUM。

要求

LITE 模式具有下列需求:

  • 您必須在設定的事務歷史記錄保留閾值內至少執行一個成功的 VACUUM 作業(預設為 30 天)。

如果不符合此需求,當您嘗試以VACUUM模式執行LITE時,會顯示下列錯誤訊息。 若要繼續,您必須在 VACUUM 模式下運行 FULL。

VACUUM <tableName> LITE cannot delete all eligible files as some files are not referenced by the log. Please run VACUUM FULL.

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

REORG TABLE指令搭配APPLY (PURGE)語法允許你重寫資料以套用軟刪除。 虛刪除不會重寫資料或刪除資料檔,而是使用元數據檔案來指出某些數據值已變更。 參見 REORG TABLE。

產生軟刪除的操作包括以下幾項:

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

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

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

Important

只有在檔案已過期並符合VACUUM保留期限的情況下,才會刪除數據檔。 這表示必須在 VACUUM 之後延遲一段時間再執行 REORG,以確保較舊的檔案已過期。 VACUUM 的保留期間可以減少,以縮短所需的等候時間,但代價是會減少保留的最大歷史記錄。

真空叢集尺寸建議

為選擇正確的叢集大小, VACUUM考慮操作分為兩個階段:

  1. 作業會從使用所有可用的執行程序節點開始,以平行方式列出來源目錄中的檔案。 該工作會將此清單與目前交易日誌中所有被參考的檔案進行比較,以識別需要刪除的檔案。 此時,驅動程式處於閑置狀態。
  2. 驅動程式會對每個被識別刪除的檔案發出刪除指令。 由於檔案刪除是僅驅動程式操作,所有操作都在單一節點進行,而工作節點則處於閒置狀態。

為了將成本和效能優化,Databricks 建議下列措施,特別是針對持續運行的真空作業:

  • 在具有自動調整設定為 1-4 個工作節點的叢集上執行真空操作,其中每個工作節點有 8 個核心。
  • 選擇核心數為 8 至 32 的驅動程式。 增加驅動程式的大小,以避免記憶體不足 (OOM) 錯誤。

如果 VACUUM 作業定期刪除超過 10,000 個檔案或需要 30 分鐘以上的處理時間,您可能需要增加驅動器的大小或工作者的數目。

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

Databricks 建議定期在所有數據表上執行 VACUUM ,以減少多餘的雲端數據儲存成本。 真空的預設保留閾值為 7 天。 設定較高的門檻能讓你取得更完整的資料表歷史,但會增加儲存的資料檔案數量,進而增加雲端供應商的儲存成本。

真空與低保留閾值

Warning

Databricks 強烈建議設定至少 7 天的保留間隔。 如果你有工作會持續執行數天,長時間執行的工作可能會寫入尚未提交的檔案。 如果保留期太短, VACUUM 可以在工作完成前刪除這些未提交的檔案。

有安全檢查是為了防止你執行危險 VACUUM 指令。 如果你確定此資料表上沒有任何執行中的作業,其執行時間會超過你打算指定的保留間隔,請將 retentionDurationCheck Spark 組態設為 false,以關閉這項安全檢查:

Delta

SET spark.databricks.delta.retentionDurationCheck.enabled = false

Iceberg

SET spark.databricks.iceberg.retentionDurationCheck.enabled = false

稽核資訊

VACUUM 將審計資訊提交至交易日誌。 使用 DESCRIBE HISTORY查詢稽核事件。

預設情況下,所有 Unity 目錄管理資料表的平台都啟用了稽核日誌。 使用 vacuum.logging Spark 配置控制真空稽核日誌:

Delta

SET spark.databricks.delta.vacuum.logging.enabled = true

Iceberg

SET spark.databricks.iceberg.vacuum.logging.enabled = true

若要將此配置套用於整個工作區,跨越所有叢集,請使用叢集政策,並在政策 JSON 中新增以下內容:

Delta

{
  "spark_conf.spark.databricks.delta.vacuum.logging.enabled": {
    "type": "fixed",
    "value": "true"
  }
}

Iceberg

{
  "spark_conf.spark.databricks.iceberg.vacuum.logging.enabled": {
    "type": "fixed",
    "value": "true"
  }
}

請參閱建立和管理計算原則。

注意

外部資料表預設也啟用稽核日誌。