Share via


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 以外のコンピューティング エンジンも、読み取り時間が平均 10% 速い V オーダー ファイルの恩恵を受け、一部のシナリオは最大 50% です。

V オーダーは、特殊な並べ替え、行グループの配布、辞書のエンコード、圧縮を Parquet ファイルに適用することで機能するため、コンピューティング エンジン内のネットワーク、ディスク、CPU リソースを読み取る必要が少なくなり、コスト効率とパフォーマンスが提供されます。 V オーダーの並べ替えは、平均書き込み時間に 15% の影響を与えますが、最大 50% の圧縮を提供します。

オープンソースの Parquet 形式に 100% 準拠しています。すべての Parquet エンジンは、これを通常の Parquet ファイルとして読み込むことができます。 デルタ テーブルはこれまで以上に効率的です。Z オーダーなどの機能は V オーダーと互換性があります。 テーブルのプロパティと最適化コマンドは、そのパーティションのコントロール V オーダーで使用できます。

V オーダーは、Parquet ファイル レベルで適用されます。 Delta テーブルおよび Z オーダー、圧縮、バキューム、タイム トラベルなどの機能は、V オーダーと直交しているため互換性があり、併用するとさらに利点があります。

V オーダー書き込みの制御

V オーダーは Microsoft Fabric で既定で有効になっており、Apache Spark では次の構成によって制御されます

構成 既定値 説明
spark.sql.parquet.vorder.enabled true セッション レベルの V オーダー書き込みを制御します。
TBLPROPERTIES(“delta.parquet.vorder.enabled”) false テーブルの既定の V オーダー モード
データフレーム ライター オプション: parquet.vorder.enabled 未設定 データフレーム ライターを使用して 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 オーダーが有効になっている状態で行われます。 これには、Delta 以外の Parquet テーブルと、テーブル プロパティが true または false に設定された parquet.vorder.enabled テーブルが含まれます。

%%sql 
SET spark.sql.parquet.vorder.enabled=TRUE 

Delta テーブルのプロパティを使用して V オーダーを制御する

テーブルの作成時に V オーダー テーブル プロパティを有効にする:

%%sql 
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

重要

table プロパティが 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 ワーカーの数、およびその構成の間の関係は、パフォーマンスに大きく影響します。 データ レイク テーブルへのデータの取り込みは、多くの小規模なファイルを頻繁に書き込むという特性を継承している可能性があります。このシナリオは一般的に「small fire problem」と呼ばれます。

書き込みの最適化は、Apache Spark エンジンの Microsoft Fabric 上の Delta Lake および Azure Synapse Analytics 機能であり、書き込まれるファイルの数を減らし、書き込まれたデータの個々のファイル サイズを増やすことを目的としています。 対象ファイルのサイズは構成を使用して、ワークロード要件ごとに変更できます。

この機能は、Microsoft Fabric Runtime for Apache Spark既定で有効になっています。 書き込みの最適化の使用シナリオの詳細については、「Apache Spark での書き込みの最適化の必要性」の記事を参照してください

マージの最適化

Delta Lake の MERGE コマンドを使用すると、ユーザーは高度な条件で Delta テーブルを更新できます。 ソース テーブル、ビュー、または DataFrame からターゲット テーブルにデータを更新するには、MERGE コマンドを使用します。 ただし、Delta Lake のオープンソース ディストリビューションの現在のアルゴリズムは、未変更の行を処理できるように完全には最適化されていません。 Microsoft Spark Delta チームは、カスタムの Low Shuffle Merge 最適化を実装しました。未変更の行は、一致した行の更新に必要な高価なシャッフル操作から除外されます。

実装はspark.microsoft.delta.merge.lowShuffle.enabled構成によって制御され、ランタイムでは既定で有効になります。 コードの変更は必要なく、Delta Lake のオープンソース ディストリビューションと完全な互換性があります。 Low Shuffle Merge の使用シナリオの詳細については、「デルタ テーブルでの Low Shuffle Merge 最適化」の記事を参照してください

デルタ テーブルのメンテナンス

デルタ テーブルが変更されると、次の理由によりパフォーマンスとストレージのコスト効率が低下する傾向があります。

  • テーブルに追加された新規データはデータを歪ませる可能性があります。
  • バッチおよびストリーミング データの取り込み率により、多数の小さなファイルが取り込まれる可能性があります。
  • 更新および削除操作では、最終的に読み取りオーバーヘッドが発生します。Parquet ファイルは設計上不変であるため、デルタ テーブルは変更セットを含む新しい Parquet 工ファイルを追加し、最初の 2 つの項目によって課せられる問題をさらに増幅させます。
  • 不要になったデータ ファイルとログ ファイルはストレージ内で利用可能になります。

テーブルを最適な状態に保ち、最高のパフォーマンスを実現するには、デルタ テーブルで Bin 圧縮およびバキューム操作を実行します。 Bin 圧縮は OPTIMIZE コマンドによって実現されます。 すべての変更をより大きな統合 Parquet ファイルにマージします。 逆参照ストレージのクリーンアップは、VACUUM コマンドによって実行されます。

テーブル管理コマンド OPTIMIZEVACUUM をノートブックおよび Spark Job Definitions 内で使用してから、プラットフォーム機能を用いて組織化できます。 「Delta Lake テーブル管理」の記事で説明したとおり、Fabric のレイクハウスでは、ユーザー インターフェイスを使用してアドホックのテーブル管理を行うことができます。

重要

取り込み頻度と予想される読み取りパターンに基づいてテーブルの物理構造を適切に設計することは、このセクションで説明する最適化コマンドを実行することよりも重要である可能性があります。

テーブルを最適化するときに V オーダーを制御する

次のコマンド構造は、TBLPROPERTIES 設定やセッション構成設定とは関係なく、V オーダーを使用して影響を受けるすべてのファイルを Bin 圧縮し、再書き込みします。

%%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 は Bin 圧縮、ZORDER、VORDER を順番に実行します。

次のコマンドは、TBLPROPERTIES 設定を使用して、影響を受けるすべてのファイルを Bin 圧縮し、再書き込みします。 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, ...)];