適切なサイズのファイルは、クエリのパフォーマンス、リソース使用率、およびメタデータ管理に重要です。 ファイルが小さいと、タスクのオーバーヘッドとメタデータ操作が増加しますが、大きなファイルでは並列処理とスキュー I/O が過小使用される可能性があります。 Delta Lake では、パーティションの排除とデータのスキップにファイル メタデータが使用されるため、適切なファイル サイズをターゲットにすることで、効率的な読み取り、書き込み、メンテナンスが保証されます。
次のセクションでは、さまざまなファイル サイズ調整機能を使用して Delta テーブルのパフォーマンスを実現する方法を示します。
調整可能なデータ レイアウト操作
Optimize
OPTIMIZE コマンドは、Delta テーブル内のデータのレイアウトを改善するために、小さなファイルを大きなファイルとして書き換えます。 ファイル サイズのチューニング情報などの詳細については、 OPTIMIZE コマンド のドキュメントを参照してください。
自動圧縮
自動圧縮では、書き込み操作のたびにパーティションの正常性が自動的に評価されます。 パーティション内の過剰なファイル断片化 (小さなファイルが多すぎる) を検出すると、書き込みがコミットされた直後に同期 OPTIMIZE 操作がトリガーされます。 圧縮はプログラムによって有益であると判断された場合にのみ実行されるため、ファイルメンテナンスに対するこのライター駆動型アプローチは一般的に最適です。 詳細な構成オプションと追加情報については、 自動圧縮 のドキュメントを参照してください。
書き込みの最適化
書き込みの最適化は、事前に「bin パッキング」手法で書き込みを圧縮し、小さなファイル関連のオーバーヘッドを削減することで、生成されるファイルをより少数で大きなものにします。 この方法では、Spark が Parquet ファイルを書き込む前にメモリ内のデータを最適なサイズのビンにシャッフルし、書き込み後のクリーンアップ操作をすぐに必要とせずに適切なサイズのファイルを生成する可能性を最大化します。
データのシャッフルの計算コストが特定の書き込みシナリオに過剰で不要な処理時間を追加する可能性がある場合は、書き込みの最適化を慎重に使用する必要があります。 書き込みの最適化は、書き込み操作で後で圧縮の候補となる小さなファイルを生成する場合に便利です。
書き込みの最適化は、次の場合に一般的に役立ちます。
- パーティション テーブル
- 小さな挿入が頻繁に行われるテーブル
- 多くのファイル (
MERGE、UPDATE、DELETE) に触れる可能性が高い操作
特定のテーブルに対する選択的なアプリケーションの場合は、セッション構成の設定を解除し、table プロパティを個別に有効にします。 セッションレベルの構成をクリアすると、Sparkセッションは書き込み最適化の適用について各テーブルの判断に従うことができます。
書き込みの最適化の設定を解除する
spark.conf.unset("spark.databricks.delta.optimizeWrite.enabled")個々のテーブルで有効にする
ALTER TABLE dbo.table_name SET TBLPROPERTIES ('delta.autoOptimize.optimizeWrite' = 'true')
Spark セッション内のすべてのパーティション テーブルへの書き込みを有効にするには、セッション構成が設定されていないことを確認してから、セッション構成 spark.microsoft.delta.optimizeWrite.partitioned.enabled有効にします。
最適化書き込みから生成されるターゲット ファイル サイズは、 spark.databricks.delta.optimizeWrite.binSize 構成を使用して調整できます。
注
リソース プロファイル別の既定の書き込み設定の最適化については、リソース プロファイルを参照してください。
ターゲット ファイルのサイズを一貫して設定する
最適化、自動圧縮、書き込みの最適化のためにターゲット ファイル サイズの最小および最大セッション構成を設定する必要がないように、Microsoft Fabric では、関連するすべてのデータ レイアウト構成をテーブル レベルで統合する手段として、 delta.targetFileSize テーブル プロパティが提供されます。 ターゲット ファイル サイズの値はバイト文字列として入力されます (たとえば、 1073741824b、 1048576k、 1024m、 1g)。 指定すると、他のすべてのセッション構成とアダプティブ ターゲット ファイル サイズよりも優先されます。
ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.targetFileSize' = '256m')
アダプティブ ターゲット ファイルのサイズ
Microsoft Fabric では、 delta.targetFileSize テーブル プロパティを使用して、セッション内のすべてのテーブルまたは個々のテーブルのターゲット ファイル サイズを手動で調整する場合に関連する複雑さを排除するために、アダプティブ ターゲット ファイル サイズを提供します。 アダプティブ ターゲット ファイル サイズでは、テーブル サイズなどの Delta テーブル ヒューリスティックを使用して理想的なターゲット ファイル サイズを推定し、条件の変化に応じてターゲットを自動的に更新し、手動による介入やメンテナンスのオーバーヘッドなしで最適なパフォーマンスを確保します。
注
現在、既定では有効になっていませんが、 アダプティブ ターゲット ファイル サイズ セッション構成を有効にすることをお勧めします。
次の Spark セッション構成を設定して、Spark セッション内で作成または変更されたテーブルでアダプティブ ターゲット ファイル サイズを有効にします。
有効にすると、アダプティブ ターゲット ファイル サイズが評価され、次のシナリオで設定されます。
-
CREATE TABLE AS SELECT操作とCREATE OR REPLACE TABLE AS SELECT操作 - 上書き書き込み (例:
DataFrame.write.mode("overwrite")やINSERT OVERWRITE) - 新しいテーブルを作成するときに、
ErrorIfExists、Append、またはIgnoreモードで書き込みます -
OPTIMIZEコマンドの開始時
設定すると、すべての OPTIMIZE 操作の開始時に理想的なサイズが再評価され続け、現在のヒューリスティックに最新のデータ分布とテーブルの増加が確実に反映されるようになります。 このアダプティブ アプローチでは、時間の経過と同時にターゲット ファイルのサイズが自動的に更新されるため、データの増加に合わせてクエリと書き込みのパフォーマンスを維持しながら、手動でチューニングする必要がなくなります。 ハイパーチューニングやテストのユース ケースなど、特定のサイズでロックする必要がある場合は、ユーザー定義 delta.targetFileSize テーブル プロパティを明示的に設定することで、アダプティブ設定をオーバーライドできます。
評価されたアダプティブ ターゲット ファイル サイズの値は、テーブルで DESCRIBE DETAIL または DESCRIBE EXTENDED を実行して監査できます。 アダプティブ評価サイズは、テーブル プロパティの delta.targetFileSize.adaptiveにバイト文字列として格納されます。 この値は、最適化、自動圧縮、書き込みの最適化のための最大サイズまたはターゲット サイズの構成として使用されます。 関連する構成で使用される最小値は、 delta.targetFileSize.adaptiveの半分として計算されます。
アダプティブ ターゲット ファイル サイズは、次の Spark セッション構成を使用してさらに構成できます。
| プロパティ | Description | デフォルト値 | セッション構成 |
|---|---|---|---|
| minFileSize | アダプティブ ターゲット ファイル サイズが評価時に使用するバイト文字列として、最小ファイル サイズ (下限) を指定します。 128 MB から 1 GB の間である必要があります。 | 128m | spark.microsoft.delta.targetFileSize.adaptive.minFileSize |
| maxFileSize | アダプティブ ターゲット ファイル サイズが評価時に使用するバイト文字列として最大ファイル サイズ (上限) を指定します。 128 MB から 1 GB の間である必要があります。 | 1024m | spark.microsoft.delta.targetFileSize.adaptive.maxFileSize |
| stopAtMaxSize |
trueすると、計算されたターゲット ファイル サイズがmaxFileSizeに達すると、さらにサイズの評価が停止され、非常に大きなテーブルの評価オーバーヘッドが軽減されます。 |
true | spark.microsoft.delta.targetFileSize.adaptive.stopAtMaxSize |
注
stopAtMaxSizeが有効になっている場合 (既定値)、アダプティブ ターゲット サイズは最大値に達した後も固定され、追加の計算が回避されます。 拡大後にテーブルが縮小する可能性がある場合は、このプロパティを false に設定して、最大しきい値を下回る再計算を許可します。
次の表は、テーブル サイズと最適な Parquet ファイル サイズの関係を示しています。 10 GB 未満のテーブルの場合、Fabric Spark ランタイムはターゲット ファイル サイズを 128 MB に評価します。 テーブル サイズが大きくなると、ターゲット ファイル のサイズは直線的にスケーリングされ、10 TB を超えるテーブルでは最大 1 GB に達します。
小さい 128 MB から始めてから、テーブルのサイズが大きくなるにつれて Parquet ファイルのサイズをスケーリングすると、次のような利点があります。
デルタ ファイルのスキップの改善: 適切なサイズのファイルは最適なデータ クラスタリングとスキップをサポートするため、Delta のファイル スキップ プロトコルにより、クエリの実行中に無関係なファイルを排除できます。 1 GB ファイルではなく 128 MB のファイルを含む小さなテーブルを使用すると、8 倍のファイルスキップが可能になります。
更新コストの削減:
MERGE操作とUPDATE操作は、影響を受けるファイルのみを書き換えます。 適切なサイズのファイルは、操作ごとにタッチされるファイルの数を最小限に抑え、書き換えられたデータの量を減らします。 削除ベクターを有効にすると、十分なファイルサイズ設定が重要になります。大きすぎるファイルの行レベルの墓石は、圧縮または削除操作中に大幅なクリーンアップコストが発生します。最適化された並列処理: 適切なサイズのファイルを使用すると、Spark で理想的なタスクの並列処理を実現できます。 小さなファイルが多すぎるとスケジューラが圧倒されます。大きなファイルが少なすぎると、Spark プールの使用率が低くなります。 最適なサイズ設定により、読み取りと書き込みの両方のスループットが最大化されます。
アダプティブ ターゲット ファイル サイズを使用すると、圧縮のパフォーマンスを 30 から 60% 向上させ、既定よりも最適なファイル サイズを選択した場合に、より高速なクエリと書き込みを実現できます。 アダプティブ評価で既定の Spark セッション構成と同じサイズが得られた場合、パフォーマンスの向上は期待されません。
Important
書き込み増幅を回避するため(テーブルの拡大に合わせてアダプティブ ターゲット ファイル サイズが大きくなると、既に圧縮されたファイルが書き換えられます)、 ファイル レベルの圧縮ターゲットが有効になります。 この機能により、以前のアダプティブ ターゲット サイズで圧縮されたファイルが不必要に再圧縮されるのを防ぐことができます。 詳細については、 ファイル レベルの圧縮ターゲットに関するドキュメントを参照してください。
ベスト プラクティスの概要
- 手動スケジューリングを回避し、ファイルを自動的に圧縮し続けるために、頻繁に小さな書き込み (ストリーミングまたはマイクロバッチ) を使用するインジェスト パイプラインに対して自動圧縮を有効にします。
- 他の書き込みパターンでは、小さなファイルの蓄積に対する保険として有効にすることが有益ですが、データ処理サービス レベルの目標が処理時間の定期的な急増を許容するかどうかを検討します。
- アダプティブ ターゲット ファイル サイズを有効 にして、最適なターゲット ファイル サイズに関する推測を削除します。
- 制御されたインジェスト パス (シャッフル、パーティション分割シナリオ、または頻繁な小さな書き込みを許容できるバッチ ジョブ) で書き込みの最適化を使用して、小さなファイルの作成とダウンストリームのメンテナンス コストを削減します。 書き込み前圧縮 (書き込みの最適化) は、書き込み後の圧縮 (最適化) よりもコストが低い傾向があります。
- 多数のパーティションを書き直すか、Z オーダーを実行する必要がある場合は、
OPTIMIZEの操作をスケジュールします。 -
高速最適化を有効にして、書き込みの増幅を最小限に抑え、
OPTIMIZEべき等性を高める (高速最適化を参照)。 - データ レイアウト機能と Spark セッション間で
delta.targetFileSizeの値の一貫性を維持するには、または望ましいアダプティブ ターゲット ファイル サイズを使用します。 - テーブルが大きく成長し、ターゲットファイルサイズが大きくなることで発生する書き込み増幅を防ぐため、ファイルレベルの圧縮ターゲットを有効にしてください。