設定 Delta Lake 來控制數據檔大小
Delta Lake 提供手動或自動設定寫入和 OPTIMIZE
作業目標檔案大小的選項。 Azure Databricks 會自動調整其中許多設定,並啟用功能,藉由搜尋正確的檔案來自動改善數據表效能。
注意
在 Databricks Runtime 13.3 和更新版本中,Databricks 建議針對 Delta 數據表配置使用叢集。 請參閱針對差異資料表使用液態叢集 \(英文\)。
Databricks 建議使用預測性優化來自動執行 OPTIMIZE
和 VACUUM
用於 Delta 數據表。 請參閱 Delta Lake 的預測優化。
在 Databricks Runtime 10.4 LTS 和更新版本中,一律會針對 MERGE
、 UPDATE
和 DELETE
作業啟用自動壓縮和優化寫入。 您無法停用此功能。
除非另有指定,否則本文中的所有建議都不適用於執行最新運行時間的 Unity 目錄受控數據表。
針對 Unity 目錄受控數據表,如果您使用 SQL 倉儲或 Databricks Runtime 11.3 LTS 或更新版本,Databricks 會自動調整大部分的設定。
如果您要從 Databricks Runtime 11.0 或以下版本升級工作負載,請參閱 升級至背景自動壓縮。
執行時機 OPTIMIZE
自動壓縮和優化寫入會減少小型檔案問題,但並非 完全取代 OPTIMIZE
。 特別是對於大於 1 TB 的數據表,Databricks 建議依排程執行 OPTIMIZE
以進一步合併檔案。 Azure Databricks 不會自動在數據表上執行 ZORDER
,因此您必須執行 OPTIMIZE
ZORDER
,才能啟用增強的數據略過。 請參閱 Delta Lake 的數據略過。
什麼是 Azure Databricks 上的自動優化?
自動優化一詞有時用來描述由 設定delta.autoOptimize.autoCompact
和 delta.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 和更新版本中,當其他寫入器執行 、MERGE
、 UPDATE
或 OPTIMIZE
等作業DELETE
時,自動壓縮可能會導致其他作業因交易衝突而失敗。 這不是 Databricks Runtime 10.4 和更新版本的問題。
Azure Databricks 上 Delta Lake 的優化寫入
優化寫入可改善檔案大小,因為數據會寫入,並有利於數據表上的後續讀取。
優化寫入對分割數據表最有效,因為它們會減少寫入每個分割區的小型檔案數目。 寫入較少的大型檔案比寫入許多小型檔案更有效率,但您仍然可能會看到寫入延遲增加,因為數據在寫入之前會隨機顯示。
下圖示範優化寫入的運作方式:
注意
您可能有執行的程式代碼, 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.tuneFileSizesForRewrites
true
設定為 。 當設定為 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 目錄受控數據表自動觸發的背景自動壓縮。