Delta Lake 資料表最佳化和 V 順序
Lakehouse 和 Delta Lake 資料表格式是 Microsoft Fabric 的核心,確保資料表針對分析進行最佳化是關鍵需求。 本指南涵蓋 Delta Lake 資料表最佳化概念、組態,以及如何將其套用至最常見的巨量資料使用模式。
什麼是 V 順序?
V 順序是對 Parquet 檔案格式的寫入時間最佳化,可在 Power BI、SQL、Spark 等 Microsoft Fabric 計算引擎下實現如閃電般迅速的讀取。
Power BI 和 SQL 引擎利用 Microsoft Verti-Scan 技術和 V 排序的 Parquet 檔案,實現類似記憶體中的資料存取時間。 Spark 和其他非 Verti-Scan 計算引擎也受益於 V 順序檔案,其讀取時間平均加快 10%,在某些情況下高達 50%。
V 順序的運作方式是對 parquet 檔案套用特殊的排序、資料列群組散發、字典編碼和壓縮,從而需要計算引擎中較少的網路、磁碟和 CPU 資源來讀取檔案,從而提供成本效益和效能。 V 順序排序對平均寫入時間有 15% 的影響,但可提供高達 50% 的壓縮率。
完全符合開放原始碼 Parquet 格式;所有 Parquet 引擎都可以將其作為一般 Parquet 檔案進行讀取。 差異資料表比以往更有效率:Z 軸順序等功能與 V 順序相容。 資料表屬性和最佳化命令可用於其分割區上的控制 V 順序。
V 順序會在 Parquet 檔案層級套用。 差異資料表及其 Z 軸順序、壓縮、清理、時間旅行等功能與 V 順序正交,因此它們互相相容,且搭配使用可獲得額外的好處。
控制 V 順序寫入
V 順序 預設 會在 Microsoft Fabric 中啟用,在 Apache Spark 中由下列組態控制。
組態 | 預設值 | 說明 |
---|---|---|
spark.sql.parquet.vorder.enabled | true | 控制工作階段層級 V 順序寫入。 |
TBLPROPERTIES("delta.parquet.vorder.enabled") | false | 資料表上的預設 V 順序模式 |
DataFrame 寫入器選項:parquet.vorder.enabled | 取消設定 | 使用 DataFrame 寫入器控制 V 順序寫入 |
使用下列命令來控制 V 順序寫入的使用方式。
檢查 Apache Spark 工作階段中的 V 順序組態
%%sql
SET spark.sql.parquet.vorder.enabled
停用 Apache Spark 工作階段中的 V 順序寫入
%%sql
SET spark.sql.parquet.vorder.enabled=FALSE
啟用 Apache Spark 工作階段中的 V 順序寫入
重要
工作階段層級啟用時。 所有 Parquet 寫入都在 V 訂單啟用的狀態下進行。 這包括 Parquet 非差異資料表和差異資料表,且 parquet.vorder.enabled
資料表屬性設定為 true
或 false
。
%%sql
SET spark.sql.parquet.vorder.enabled=TRUE
使用差異資料表屬性控制 V 順序
在資料表建立期間啟用 V 順序資料表屬性:
%%sql
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");
重要
資料表 屬性設定為 true 時,INSERT、UPDATE 和 MERGE 命令會如預期般運作,並執行寫入時間最佳化。 如果 V 順序工作階段組態設定為 true 或 spark.write 啟用它,則即使 TBLPROPERTIES 設定為 false,寫入也會是 V 順序。
藉由變更資料表屬性來啟用或停用 V 順序:
%%sql
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "false");
ALTER TABLE person UNSET TBLPROPERTIES("delta.parquet.vorder.enabled");
使用資料表屬性啟用或停用 V 順序之後,只會影響未來對資料表的寫入。 Parquet 檔案會保留其建立時的排序。 若要變更目前的實體結構來套用或移除 V 順序,請閱讀下方的<最佳化資料表時控制 V 順序>章節。
在寫入作業上直接控制 V 順序
如果未明確設定,所有 Apache Spark 寫入命令都會繼承工作階段設定。 下列所有命令透過隱含繼承會話組態來使用 V 順序寫入。
df_source.write\
.format("delta")\
.mode("append")\
.saveAsTable("myschema.mytable")
DeltaTable.createOrReplace(spark)\
.addColumn("id","INT")\
.addColumn("firstName","STRING")\
.addColumn("middleName","STRING")\
.addColumn("lastName","STRING",comment="surname")\
.addColumn("birthDate","TIMESTAMP")\
.location("Files/people")\
.execute()
df_source.write\
.format("delta")\
.mode("overwrite")\
.option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
.saveAsTable("myschema.mytable")
重要
V 順序僅適用於受述詞影響的檔案。
在 spark.sql.parquet.vorder.enabled
未設定或設定為 false 的工作階段中,下列命令會使用 V 順序寫入:
df_source.write\
.format("delta")\
.mode("overwrite")\
.option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
.option("parquet.vorder.enabled ","true")\
.saveAsTable("myschema.mytable")
DeltaTable.createOrReplace(spark)\
.addColumn("id","INT")\
.addColumn("firstName","STRING")\
.addColumn("middleName","STRING")\
.addColumn("lastName","STRING",comment="surname")\
.addColumn("birthDate","TIMESTAMP")\
.option("parquet.vorder.enabled","true")\
.location("Files/people")\
.execute()
什麼是最佳化寫入?
在使用標準化較大的檔案大小時,Apache Spark 等巨量資料處理引擎上的分析工作負載執行效率最高。 檔案大小、檔案數目、Spark 背景工作角色數目及其組態之間的關聯性,對於效能至關重要。 將資料擷取到資料湖資料表可能具有不斷寫入許多小型檔案的繼承特性:此案例通常稱為「小型檔案問題」。
最佳化寫入是 Apache Spark 引擎中 Microsoft Fabric 和 Azure Synapse Analytics 上的 Delta Lake,可減少寫入的檔案數目,並旨在增加寫入資料的個別檔案大小。 可以使用組態依工作負載需求來變更目標檔案大小。
此功能預設在適用於 Apache Spark 的 Microsoft Fabric 執行階段中啟用。 若要深入了解最佳化寫入使用方式案例,請閱讀文章<Apache Spark 上的最佳化寫入需求>。
合併最佳化
Delta Lake MERGE 命令可讓使用者使用進階條件來更新差異資料表。 它可以使用 MERGE 命令將資料從來源資料表、檢視或 DataFrame 更新到目標資料表中。 不過,Delta Lake 開放原始碼發行版中的目前演算法並未針對處理未修改的資料列進行完全最佳化。 Microsoft Spark Delta 小組實作自訂低隨機合併最佳化,未修改的資料列會從更新相符資料列所需的昂貴隨機作業中排除。
實作由 spark.microsoft.delta.merge.lowShuffle.enabled
組態所控制,預設 在執行階段中啟用。 它不需要變更程式碼,且與 Delta Lake 的開放原始碼發行版完全相容。 若要深入了解低隨機合併使用案例,請閱讀文章<差異資料表上的低隨機合併最佳化>。
差異資料表維護
差異資料表變更時,效能和儲存體成本效益通常會因為下列原因而降低:
- 新增至資料表的新資料可能會扭曲資料。
- 批次和串流資料擷取速率可能會引入許多小型檔案。
- 更新和刪除作業最終會建立讀取額外負荷;依設計,Parquet 檔案是不可變的,因此,差異資料表會使用變更集新增新的 Parquet 檔案,從而進一步放大前兩個項目帶來的問題。
- 不再需要儲存體中可用的資料檔案和記錄檔。
為了讓資料表保持最佳狀態來獲得最佳效能,在差異資料表中執行間隔壓縮清理作業。 間隔壓縮由 OPTIMIZE 命令達成;它會將所有變更合併成較大的合併 Parquet 檔案。 VACUUM 命令可達成取值儲存體清除過程。
資料表維護命令 OPTIMIZE 和 VACUUM 可在筆記本和 Spark 工作定義中使用,然後使用平台功能進行協調。 Fabric Lakehouse 提供一項功能,可使用使用者介面來執行臨機操作資料表維護,如<Delta Lake 資料表維護>一文中所述。
重要
根據擷取頻率和預期的讀取模式正確設計資料表實體結構,可能比執行本區段所述的最佳化命令更重要。
最佳化資料表時控制 V 順序
下列命令會建構間隔壓縮,並使用 V 順序重寫所有受影響的檔案,與 TBLPROPERTIES 設定或工作階段組態設定無關:
%%sql
OPTIMIZE <table|fileOrFolderPath> VORDER;
OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> VORDER;
OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> [ZORDER BY (col_name1, col_name2, ...)] VORDER;
ZORDER 和 VORDER 一起使用時,Apache Spark 會循序執行間隔壓縮、ZORDER、VORDER。
下列命令會使用 TBLPROPERTIES 設定來進行間隔壓縮並重寫所有受影響的檔案。 如果 TBLPROPERTIES 將 V 順序設定為 true,則所有受影響的檔案都會以 V 順序的形式寫入。 如果未設定 TBLPROPERTIES 或將 V 順序設定為 false,則會繼承工作階段設定;因此,若要從資料表中移除 V 順序,請將工作階段組態設為 false。
%%sql
OPTIMIZE <table|fileOrFolderPath>;
OPTIMIZE <table|fileOrFolderPath> WHERE predicate;
OPTIMIZE <table|fileOrFolderPath> WHERE predicate [ZORDER BY (col_name1, col_name2, ...)];