液体クラスタリングは、Microsoft Fabricの差分テーブルの柔軟なデータ レイアウト戦略です。 これは、静的な Hive スタイルのパーティション分割と手動の Z オーダー メンテナンスを、宣言型の変更に対応したクラスタリングに置き換えます。 クラスター化する列を定義し、Fabric Spark ランタイムが物理データ レイアウトを自動的に処理します。
この記事を使用して、次の操作を行います。
- 液体クラスタリングのしくみと、それを使用するタイミングについて説明します。
- 液体クラスタリングとパーティション分割と Z オーダーを比較します。
- テーブルにクラスタリングを構成します。
- インクリメンタル リキッド クラスタリングについて (ランタイム 2.0 以降)。
- セッション構成を使用してクラスタリングの動作を調整します。
液体クラスタリングとは
Liquid クラスタリングでは、デルタ テーブル ファイル内のデータが整理され、クラスタリング列に類似した値を持つ行が併置されます。 レイアウトにより、クエリの実行中に拡張 ファイルのスキップ が可能になります。クエリがクラスタリング列をフィルター処理すると、エンジンは値範囲が述語と一致するファイルのみを読み取り、残りはスキップします。
パーティション分割とは異なり、液体クラスタリング:
- 列の値ごとに物理ディレクトリ構造を作成しません。
- テーブル作成時にクラスタリング列を選択する必要はありません (後で変更できます)。
- 数千の小さなパーティションから小さなファイルの潜在的な問題を作成することなく、カーディナリティの高い列を処理します。
- 書き込み時ではなく、
OPTIMIZE中にレイアウトの最適化を適用します。
パーティション分割と Z オーダーに対する利点
液体クラスタリングは、進化するデータ パターンの柔軟性、メンテナンス、および処理の観点から、Hive スタイルのパーティション分割と Z オーダーの両方に比べて大きな利点を提供します。
Hive スタイルのパーティション分割と比較した場合
| アスペクト | Hive スタイルのパーティション分割 | リキッド クラスタリング |
|---|---|---|
| 細分性 | 個別の値 (または組み合わせ) ごとに 1 つのディレクトリ | ファイル レベルの値の範囲(ディレクトリなし) |
| カーディナリティが高い | 何千もの小さなファイル/ディレクトリを作成します | 自然に対応し、データを適切なサイズのファイルに振り分けます |
| 列の変更 | テーブルの完全な書き換えが必要 |
ALTER TABLE ... CLUSTER BY 次に適用されます OPTIMIZE |
| 書き込みパス | パーティション列は書き込み時に認識されている必要があります | 任意の列は後からクラスター化できます |
| 小さなファイルの問題 | ストリーミングや頻繁な挿入でよく見られる |
OPTIMIZE圧縮によって管理される |
Z オーダーと比較
| アスペクト | Z オーダー | リキッド クラスタリング |
|---|---|---|
| 列の変更 | 新しい列を使用して OPTIMIZE ZORDER BY (...) を再実行する必要がある |
ALTER TABLE ... CLUSTER BY は定義を保持します |
| 段階的サポート | 増分モードなし。 WHERE を使用してスコープを手動で制限する |
増分モード (ランタイム 2.0 以降) では、新しいファイル、変更されたファイル、または異常なファイルのみが自動的に処理されます |
| Metadata | 永続的な列定義なし | テーブル メタデータに格納されている列のクラスタリング |
| 複数列レイアウト | 最適化時に適用される Z オーダー曲線 | 1 つのクラスタリング列の Z オーダー。2 列以上のヒルベルト曲線により、データの局所性を最適化 |
液体クラスタリングでは、単一列レイアウトに Z オーダーを使用し、2 つ以上の列に対してヒルベルト曲線を使用します。これは、多次元クラスタリングに Z オーダー曲線のみを適用する Z オーダーの改善です。 Liquid クラスタリングでは、両方のアルゴリズムがメタデータ対応の増分フレームワークでラップされ、継続的なメンテナンス コストが削減されます。
液体クラスター化テーブルを作成する
テーブル作成時に CLUSTER BY 句を使用してクラスタリング列を定義します。
-- Create a new clustered table
CREATE TABLE dbo.sales (
order_id BIGINT,
order_date DATE,
region STRING,
amount DECIMAL(10,2)
) CLUSTER BY (order_date, region);
-- Create from query results
CREATE TABLE dbo.sales_clustered
CLUSTER BY (order_date, region)
AS SELECT * FROM raw_sales;
-- Enable on existing table
ALTER TABLE dbo.sales_txn CLUSTER BY (order_date, region);
クラスタリング列を変更する
パーティション分割とは異なり、データを書き換えることなく、クラスタリング列をいつでも変更できます。
-- Change clustering columns
ALTER TABLE sales CLUSTER BY (region, product_category);
-- Remove clustering (table becomes unclustered)
ALTER TABLE sales CLUSTER BY NONE;
クラスタリング列を変更した後、新しいレイアウトは次の OPTIMIZE 実行に適用されます。 既存のファイルは、再クラスター化されるまで以前のレイアウトを保持します。
OPTIMIZE を使用してクラスタリングを適用する
クラスタリングは、 OPTIMIZE コマンド中に適用されます。 クラスタリング定義はテーブル メタデータに格納されるため、 OPTIMIZE ステートメントで列を指定する必要はありません。
-- Cluster the table using the defined clustering columns
OPTIMIZE sales;
-- Recluster partial Z-Cubes and Z-Cubes with different clustering keys or clustering providers
OPTIMIZE sales FULL;
クラスタリング キーを変更し、現在のクラスタリング戦略に準拠していない Z キューブを再構築する場合は、 OPTIMIZE FULL を使用します。
Z キューブは、同じクラスタリング列を共有するファイルをグループ化するために液体クラスタリングが使用する論理ユニットです。 クラスター キーが変更されるか、データの量が 100 GB を超えるまで、データは 1 つの Z キューブにクラスター化されます。
Tip
Fabric Runtime 2.0 以降では、Native 実行エンジン は、液体クラスター化テーブルに対する OPTIMIZE の実行をサポートし、30 から 50% 高速な多次元クラスタリング パフォーマンスを実現します。 以前のランタイムは、通常のアクセラレーションされていない Spark の実行にフォールバックします。
液体クラスタリングのしくみ
液体クラスター化テーブルで OPTIMIZE を実行すると、次の処理が行われます。
-
ファイルの選択: エンジンは、クラスタリングが必要なファイルを選択します。
- Runtime 2.0+(増分クラスタリング戦略)では、クラスタリングされていない、不健全な、小さいサイズの、または削除ベクターファイルのみが選択されます。
- ランタイム 1.3 では、既にクラスター化されているかどうかに関係なく、100 GB 未満のすべての Z キューブ内のすべてのファイルが選択されます。
- ビンパッキング: 選択したファイルは、最適な出力ファイルサイズをターゲットとするビンにグループ化されます。
- 再分割: 各ビン内のデータは、スペース充填曲線 (複数列の場合はヒルベルト曲線、単一列の場合は Z オーダー) を使用して再分割されます。
- ファイルの書き込み: 再パーティション分割されたデータは、クラスタリング列の値範囲が狭い新しいファイルとして書き込まれます。
- メタデータの更新: Delta ログには、ファイルの置換が記録され、クラスタリング メタデータを使用して新しいファイルにタグが付けられます。
結果として、クラスタリング列で重複しない (または重複しない) 値範囲を持つファイルが生成され、エンジンはクエリ述語と一致しないファイルをスキップできます。
Caution
Fabric ランタイム 1.3 (デルタ 3.2): 注意して液体クラスタリングを使用します。 このランタイムでは、液体クラスタリングは完全な Z キューブ書き換え戦略を使用します。Z キューブ内のすべてのファイルは、実行ごとに書き換えられます。 Z キューブは、サイズが 100 GB を超える場合にのみ保持 (スキップ) されます。 100 GB 未満のテーブルの場合、完全書き換えは、データが既に適切にクラスター化されている場合でも、すべての OPTIMIZE 実行ですべてのテーブル データが書き換えられます。 これにより、重大な書き込み増幅が発生します。
- ランタイム 1.3 では、液体クラスタリングでは自動圧縮を使用しないでください。 すべての自動圧縮トリガーでは、新しいデータまたは変更されたデータをクラスタリングするのではなく、テーブル全体の書き換えが発生する可能性があります。
- 書き込み操作のたびに
OPTIMIZEを実行しないでください。 ランタイム 1.3 では、クラスタリングを戦略的な意図的な実行に制限し、それらの間のクラスタリングの鮮度を低く受け入れます。
この書き込み増幅を排除する増分液体クラスタリングは、Fabric ランタイム 2.0 以降でのみ使用できます。
増分型流動クラスタリング
Fabric ランタイム 2.0 (デルタ 4.1) 以降では、液体クラスタリングでは既定で incremental クラスタリング戦略が使用されます。 増分戦略は、標準のクラスタリング動作よりも大幅に改善されています。
重要
増分液体クラスタリングは、Fabric ランタイム 2.0 以降でのみ使用できます。 以前のランタイムでは、 OPTIMIZE は、Z キューブ内のすべてのファイルが実行時に書き換える標準 (完全書き換え) 動作を使用します。
インクリメンタル クラスタリング戦略が重要な理由
標準クラスタリング アルゴリズムは、既にクラスター化されているかどうかに関係なく、実行ごとに Z キューブ内OPTIMIZEファイル (最大 100 GB) を書き換えます。 小さな追加を受け取るテーブルの場合、クラスタリング コストは、新しいデータの量ではなく、テーブル サイズに比例して増加します。
増分モードでは、実際にクラスタリングが必要なファイルのみを選択することで、完全書き換えの問題を解決します。
- クラスター化されていないファイル: クラスタリング メタデータなしで新しく書き込まれたデータ
- 小さいファイル: ターゲット ファイル サイズのしきい値を下回るファイル
- 削除ベクトルを含むファイル: クリーンアップしきい値を超える累積削除を含むファイル
既に適切にクラスター化された適切なサイズのファイルは、完全にスキップされます。
自動再クラスタリング
増分液体クラスタリングには、自動 再クラスター化と呼ばれる自動オーバーラップ検出が含まれています。これは、時間の経過と同時にクラスタリングの品質を維持します。 新しいデータが到着すると、ファイル値の範囲間に重複が生じ、データのスキップ効果が低下する可能性があります。 自動再クラスター化は、ファイル間で重複する値範囲を検出し、影響を受けるファイルのみを選択的に再クラスター化します。
自動再クラスター化は、クラスターに新しいデータまたは変更されたデータがある場合は常に、 OPTIMIZE の一部として自動的に実行されます。 手動による介入やスケジュールされた完全な再クラスターは必要ありません。 増分クラスタリング戦略では、データの進化に伴い、ほぼ最適なクラスタリング品質が維持されます。
完全書き換え動作に戻す
増分クラスタリング戦略を無効にし、完全書き換え動作を使用する必要がある場合は、次の構成を設定します。
SET spark.microsoft.delta.optimize.clustering.strategy.incremental = FALSE;
OPTIMIZE sales;
または、セッション設定を変更せずに、1 回限り完全な再クラスターに対して OPTIMIZE FULL を使用します。
OPTIMIZE sales FULL;
Note
インクリメンタル クラスタリング戦略では、理論的に最適なレイアウトからの小さな偏差を意図的に許可して、書き込み増幅の大幅な削減を実現します。
OPTIMIZE FULL実行すると、Z-Cube を理論上の最適な値に完全に再構築することで、そのギャップを埋めますが、書き込みコストは高くなります。
構成参照
次のセッション構成は、Fabric Runtime 2.0 以降での液体クラスタリング動作を制御します。
増分クラスタリング
| コンフィギュレーション | タイプ | Default | 説明 |
|---|---|---|---|
spark.microsoft.delta.optimize.clustering.strategy.incremental |
ブール値 | true |
増分クラスタリングのマスター スイッチ。
true場合、OPTIMIZEは、クラスター化されていない、異常な、小さい、および削除ベクター ファイルのみを処理します。
falseすると、サイズが 100 GB 未満の Z キューブのすべてのファイルが書き換えられます (標準動作)。 |
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster |
ブール値 | true |
重複するデータ範囲を持つファイルの自動検出と再クラスター化を有効にします。 増分クラスタリングが有効な場合にのみ適用されます。 |
自動再クラスター調整
これらの構成は、自動再クラスター化の感度とスコープを制御します。 既定値は、ほとんどのワークロードに適しています。 クラスタリング品質と書き込み増幅のトレードオフを変更する必要がある場合にのみ調整します。
| コンフィギュレーション | タイプ | Default | 説明 |
|---|---|---|---|
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOffendingFiles |
Int | 4 |
再クラスター化をトリガーするために必要な重複するファイルの最小数。 値を小さくすると、より早く再クラスター化されます (クエリのパフォーマンスが向上し、書き込みコストが高くなります)。 ≥ 2 である必要があります。 |
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOverlapThreshold |
Double | 0.75 |
クラスタリング次元の重複スコアしきい値。 この値より上のスコアリングのファイル ペアは重複していると見なされます。 範囲 (0.25, 1.0] である必要があります。 値を小さくすると、より積極的になります。 |
クラスタリング列の選択
最適な結果を得るには、最も一般的なクエリ フィルター パターンに基づいてクラスタリング列を選択します。
- 列数が増えるほど、空間充填曲線による列単位のファイルスキップ効果が薄れ、データのクラスタリングにかかる時間が長くなります。
- 列のカーディナリティを考慮してください。 カーディナリティの低い列では、個別の値範囲が少なくなり、カーディナリティの高いクラスタリング キーと組み合わせた場合のファイル スキップの利点が軽減されます。
-
列の順序はクラスタリングに影響しません。
CLUSTER BY後に指定された列の順序は、結果の多次元クラスタリングには影響しません。
サポートされている列の種類
すべての列の種類をクラスタリング キーとして使用できるわけではありません。 エンジンは、各列のデータ型を評価して適格性を判断します。
常に対象となる(アトミック型):
-
NumericType(ByteType、ShortType、IntegerType、LongType、FloatType、DoubleType、DecimalType) DateTypeTimestampTypeTimestampNTZTypeStringType
条件付きで対象:
Note
次の種類は、Fabric Spark Runtime 2.0 (Delta 4.1) 以降で有効にすることができます
-
StructType:spark.microsoft.delta.clusteredTable.complexTypes.enabledが有効になっており、すべてのリーフ フィールドがそれ自体が対象となる型である場合。 -
ArrayType:spark.microsoft.delta.clusteredTable.complexTypes.enabledが有効で、要素の種類が対象である場合。 -
MapType:spark.microsoft.delta.clusteredTable.complexTypes.enabledが有効になっており、キーと値の両方の型が順序付け可能で適格な場合。
対象外:
BinaryTypeBooleanTypeNullType
ファイル レベルの統計で使用される同等の対象となる型については、「 ファイルのスキップ - 対象となるデータ型」を参照してください。
他の機能との対話
| 特徴 | Behavior |
|---|---|
| パーティション分割 | 互換性がありません。 ファイルをスキップする目的で、パーティション分割よりも液体クラスタリングをお勧めします。 |
| Z オーダー | 互換性がありません。 ファイルをスキップする目的で、液体クラスタリングは Z オーダーよりも推奨されます。 |
| 高速最適化 | ランタイム 2.0 以降の互換性。 以前のランタイムでは、高速最適化は液体クラスター化テーブルには影響しません。
OPTIMIZE中に、小さなファイルが不足している場合や、正常なサイズの出力ファイルを生成するのに十分なデータがない場合は、クラスタリングをスキップします。 |
| アダプティブ ターゲット ファイルのサイズ | 互換性。 アダプティブ評価によって設定されたターゲット ファイル サイズは、クラスタリングのターゲット サイズとして使用されます。 |
| 書き込みの最適化 | 互換性。 書き込み時に統合ファイルを生成し、 OPTIMIZE中にクラスター化します。 |
| 自動圧縮 | ランタイム 1.3 以前の液体クラスタリングでは使用しないでください。 これらのランタイムでは、すべての自動圧縮トリガーが 100 GB 未満の Z-Cubes 内のすべてのデータを書き換え、書き込み増幅が深刻になります。 ランタイム 2.0 以降では、自動圧縮に互換性があります。増分クラスタリングでは、新しいファイルまたは異常なファイルのみが書き換えられます。 自動圧縮は、小さなファイルの統合を処理します。 OPTIMIZE はクラスタリング レイアウトを処理します。 |
| 削除ベクトル | 削除された行のしきい値を超えるファイルは、クラスタリングの状態に関係なく、クラスタリング用に選択されます。 |
| V-Order | 互換性。 V オーダーと液体クラスタリングは、異なる軸 (ファイル内部レイアウトとファイル間の値範囲) で動作します。 両方を一緒に適用できます。 |
ベスト プラクティス
- バッチ書き込み後、またはストリーミング テーブルのスケジュールに従って
OPTIMIZE定期的に実行しますが、ランタイム 2.0 以降でのみ実行します。この場合、増分クラスタリング戦略では頻繁に実行するコストが低くなります。 ランタイム 1.3 以前では、すべてのOPTIMIZE実行で Z キューブ内のすべてのデータが 100 GB 以下で書き換えられるため、実行は意図的で頻度の低いものにする必要があります。 -
OPTIMIZE FULLは控えめに使用してください。 クラスタリング列を変更した後、または 1 回限り品質のリセットが必要な場合のために予約します。 - Spark UI またはクエリ プランでクエリ スキャン メトリック (スキャンされたファイルと合計ファイル) をチェックして、クラスタリングの品質を監視します。
- ストリーミング ワークロードの書き込みの最適化と組み合わせて、各マイクロバッチでクラスタリング用の管理可能な数のファイルが生成されるようにします。