設定 Delta Lake 來控制數據檔大小

Delta Lake 提供手動或自動設定寫入和 OPTIMIZE 作業目標檔案大小的選項。 Azure Databricks 會自動調整其中許多設定,並啟用功能,藉由搜尋正確的檔案來自動改善數據表效能。

注意

在 Databricks Runtime 13.3 和更新版本中,Databricks 建議針對 Delta 數據表配置使用叢集。 請參閱針對差異資料表使用液態叢集 \(英文\)。

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

在 Databricks Runtime 10.4 LTS 和更新版本中,一律會針對 MERGEUPDATEDELETE 作業啟用自動壓縮和優化寫入。 您無法停用此功能。

除非另有指定,否則本文中的所有建議都不適用於執行最新運行時間的 Unity 目錄受控數據表。

針對 Unity 目錄受控數據表,如果您使用 SQL 倉儲或 Databricks Runtime 11.3 LTS 或更新版本,Databricks 會自動調整大部分的設定。

如果您要從 Databricks Runtime 11.0 或以下版本升級工作負載,請參閱 升級至背景自動壓縮

執行時機 OPTIMIZE

自動壓縮和優化寫入會減少小型檔案問題,但並非 完全取代 OPTIMIZE。 特別是對於大於 1 TB 的數據表,Databricks 建議依排程執行 OPTIMIZE 以進一步合併檔案。 Azure Databricks 不會自動在數據表上執行 ZORDER ,因此您必須執行 OPTIMIZEZORDER ,才能啟用增強的數據略過。 請參閱 Delta Lake 的數據略過。

什麼是 Azure Databricks 上的自動優化?

自動優化一詞有時用來描述由 設定delta.autoOptimize.autoCompactdelta.autoOptimize.optimizeWrite所控制的功能。 此字詞已淘汰,以利個別描述每個設定。 請參閱 Azure Databricks 上 Delta Lake 的自動壓縮和 Azure Databricks 上 Delta Lake 的優化寫入。

Azure Databricks 上 Delta Lake 的自動壓縮

自動壓縮會結合 Delta 數據表分割內的小型檔案,以自動減少小型檔案的問題。 自動壓縮會在寫入數據表成功之後發生,並在已執行寫入的叢集上同步執行。 自動壓縮只會壓縮先前尚未壓縮的檔案。

您可以藉由設定 Spark 組態spark.databricks.delta.autoCompact.maxFileSize來控制輸出檔案大小。 Databricks 建議根據工作負載或數據表大小使用自動調整。 請參閱 根據工作負載 自動調整檔案大小,以及 根據數據表大小自動調整檔案大小

只有至少有一定數目小型檔案的分割區或數據表,才會觸發自動壓縮。 您可以選擇性地變更觸發自動壓縮所需的最小檔案數目,方法是設定 spark.databricks.delta.autoCompact.minNumFiles

您可以使用下列設定,在資料表或工作階段層級啟用自動壓縮:

  • Table 屬性: delta.autoOptimize.autoCompact
  • SparkSession 設定: spark.databricks.delta.autoCompact.enabled

這些設定接受下列選項:

選項。 行為
auto (建議) 調整目標檔案大小,同時遵守其他自動調整功能。 需要 Databricks Runtime 10.1 或更新版本。
legacy true別名。 需要 Databricks Runtime 10.1 或更新版本。
true 使用 128 MB 作為目標檔案大小。 沒有動態重設大小。
false 關閉自動壓縮。 可以在工作階段層級設定,以覆寫工作負載中修改之所有 Delta 資料表的自動壓縮。

重要

在 Databricks Runtime 10.3 和更新版本中,當其他寫入器執行 、MERGEUPDATEOPTIMIZE 等作業DELETE時,自動壓縮可能會導致其他作業因交易衝突而失敗。 這不是 Databricks Runtime 10.4 和更新版本的問題。

Azure Databricks 上 Delta Lake 的優化寫入

優化寫入可改善檔案大小,因為數據會寫入,並有利於數據表上的後續讀取。

優化寫入對分割數據表最有效,因為它們會減少寫入每個分割區的小型檔案數目。 寫入較少的大型檔案比寫入許多小型檔案更有效率,但您仍然可能會看到寫入延遲增加,因為數據在寫入之前會隨機顯示。

下圖示範優化寫入的運作方式:

Optimized writes

注意

您可能有執行的程式代碼, coalesce(n)repartition(n) 是在寫出數據之前執行,以控制寫入的檔案數目。 優化的寫入不需要使用此模式。

Databricks Runtime 9.1 LTS 和更新版本中的下列作業預設會啟用優化寫入:

  • MERGE
  • UPDATE 含子查詢
  • DELETE 含子查詢

使用 SQL 倉儲時,也會針對 CTAS 語句和 INSERT 作業啟用優化寫入。 在 Databricks Runtime 13.1 和更新版本中,Unity 目錄中註冊的所有 Delta 數據表都已針對 CTAS 分割數據表的語句和 INSERT 作業優化寫入。

您可以使用下列設定,在資料表或工作階段層級啟用優化寫入:

  • 資料表設定: delta.autoOptimize.optimizeWrite
  • SparkSession 設定: spark.databricks.delta.optimizeWrite.enabled

這些設定接受下列選項:

選項。 行為
true 使用 128 MB 作為目標檔案大小。
false 關閉優化的寫入。 可以在工作階段層級設定,以覆寫工作負載中修改之所有 Delta 資料表的自動壓縮。

設定目標檔案大小

如果您想要調整 Delta 資料表中的檔案大小,請將 資料表屬性delta.targetFileSize 設定為所需的大小。 如果設定這個屬性,所有數據配置優化作業都會盡最大努力嘗試產生指定大小的檔案。 這裡的範例包括 優化Z 順序自動壓縮優化的寫入

注意

使用 Unity 目錄受控數據表和 SQL 倉儲或 Databricks Runtime 11.3 LTS 和更新版本時,只有 OPTIMIZE 命令會遵守 targetFileSize 設定。

Table 屬性
delta.targetFileSize

類型:以位元組為單位或更高單位的大小。

目標檔案大小。 例如, 104857600 (位元元組)或 100mb

默認值:無

對於現有的數據表,您可以使用 SQL 命令 ALTER TABLE SET TBL PROPERTIES 來設定和取消設定屬性。 您也可以在使用 Spark 工作階段設定建立新資料表時自動設定這些屬性。 如需詳細資訊,請參閱 Delta 資料表屬性參考

根據工作負載自動調整檔案大小

不論 Databricks 執行時間、Unity 目錄或其他優化為何,Databricks 建議針對許多MERGE或 DML 作業的所有資料表,將資料表屬性delta.tuneFileSizesForRewritestrue設定為 。 當設定為 true時,數據表的目標檔案大小會設定為較低的閾值,以加速大量寫入作業。

如果未明確設定,Azure Databricks 會自動偵測 Delta 數據表上前 10 個作業中有 9 個是 MERGE 作業,並將這個資料表屬性設定為 true。 您必須明確地將這個屬性設定為 , false 以避免這種行為。

Table 屬性
delta.tuneFileSizesForRewrites

類型:Boolean (英文)

是否調整數據配置優化的檔案大小。

默認值:無

對於現有的數據表,您可以使用 SQL 命令 ALTER TABLE SET TBL PROPERTIES 來設定和取消設定屬性。 您也可以在使用 Spark 工作階段設定建立新資料表時自動設定這些屬性。 如需詳細資訊,請參閱 Delta 資料表屬性參考

根據數據表大小自動調整檔案大小

若要將手動調整的需求降到最低,Azure Databricks 會根據數據表的大小自動調整 Delta 數據表的檔案大小。 Azure Databricks 會針對較小的數據表使用較小的檔案大小,而較大的數據表則使用較大的檔案大小,讓數據表中的檔案數目不會成長太大。 Azure Databricks 不會自動調整您已針對特定 目標大小 微調的數據表,或根據經常重寫的工作負載。

目標檔案大小是以 Delta 數據表的目前大小為基礎。 對於小於 2.56 TB 的數據表,自動調整的目標檔案大小為 256 MB。 對於大小介於 2.56 TB 到 10 TB 之間的數據表,目標大小會以線性方式從 256 MB 成長至 1 GB。 對於大於 10 TB 的數據表,目標檔案大小為 1 GB。

注意

當數據表的目標檔案大小成長時,命令不會將現有的檔案重新優化為較大的檔案 OPTIMIZE 。 因此,大型數據表一律會有一些小於目標大小的檔案。 如果需要將這些較小的檔案優化為較大的檔案,您可以使用 table 屬性來設定數據表 delta.targetFileSize 的固定目標檔案大小。

以累加方式寫入數據表時,目標檔案大小和檔案計數會根據數據表大小接近下列數位。 此數據表中的檔案計數只是範例。 實際結果會根據許多因素而有所不同。

資料表大小 目標檔案大小 數據表中檔案的近似數目
10 GB 256 MB 40
1 TB 256 MB 4096
2.56 TB 256 MB 10240
3 TB 307 MB 12108
5 TB 512 MB 17339
7 TB 716 MB 20784
10 TB 1 GB 24437
20 TB 1 GB 34437
50 TB 1 GB 64437
100 TB 1 GB 114437

限制在數據檔中寫入的數據列

有時候,具有窄數據的數據表可能會遇到錯誤,其中指定數據檔中的數據列數目超過 Parquet 格式的支援限制。 若要避免此錯誤,您可以使用 SQL 工作階段組態 spark.sql.files.maxRecordsPerFile 來指定要寫入 Delta Lake 資料表單一檔案的最大記錄數目。 指定零的值或負值不代表任何限制。

在 Databricks Runtime 10.5 和更新版本中,當使用 DataFrame API 寫入 Delta Lake 數據表時,您也可以使用 DataFrameWriter 選項 maxRecordsPerFile 。 指定 時 maxRecordsPerFile ,會忽略 SQL 工作階段組態 spark.sql.files.maxRecordsPerFile 的值。

注意

除非有必要避免上述錯誤,否則 Databricks 不建議使用此選項。 某些具有非常窄數據的 Unity 目錄受控數據表可能仍然需要此設定。

升級至背景自動壓縮

Databricks Runtime 11.3 LTS 和更新版本中的 Unity 目錄受控數據表可以使用背景自動壓縮。 移轉舊版工作負載或數據表時,請執行下列動作:

  • 從叢集或筆記本組態設定中移除Spark組 spark.databricks.delta.autoCompact.enabled 態。
  • 針對每個數據表,執行 ALTER TABLE <table_name> UNSET TBLPROPERTIES (delta.autoOptimize.autoCompact) 以移除任何舊版自動壓縮設定。

拿掉這些舊版設定之後,您應該會看到針對所有 Unity 目錄受控數據表自動觸發的背景自動壓縮。