Delta Lake を構成してデータ ファイルのサイズを制御する
この記事の推奨事項は、Unity Catalog で管理されるテーブルには適用されません。 Databricks では、すべての新しい Delta テーブルに対して、デフォルト設定で Unity Catalog マネージドテーブルを使用することをお勧めします。
Databricks Runtime 13.3 以降では、Databricks では Delta テーブル レイアウトにクラスタリングを使用することをお勧めします。 「Deltaテーブルにリキッドクラスタリングを使用する」を参照してください。
Databricks では、予測的最適化を使用して、 Delta テーブルのOPTIMIZE
とVACUUM
を自動的に実行することをお勧めします。 Unity Catalog マネージドテーブルの予測的最適化を参照してください。
Databricks Runtime 10.4 LTS 以降では、 MERGE
、 UPDATE
、 DELETE
の各操作で、自動圧縮と最適化された書き込みが常に有効になっています。 この機能は無効にできません。
Delta Lakeは、書き込みとOPTIMIZE
オペレーションのターゲットファイルサイズを手動または自動で設定するオプションを提供します。Databricksは、これらの設定の多くを自動的に調整し、適切なファイルサイズを追求することによってテーブルのパフォーマンスを自動的に向上させる機能を有効にします。
Unity Catalogで管理されるテーブルの場合や、SQLウェアハウスまたはDatabricks Runtime 11.3 LTS以降を使用している場合、Databricksはこれらの構成のほとんどを自動的に調整します。
Databricks Runtime 10.4 LTS 以下からワークロードをアップグレードする場合は、「 バックグラウンド自動圧縮へのアップグレード」を参照してください。
実行するタイミング OPTIMIZE
自動圧縮と最適化された書き込みは、それぞれ小さなファイルの問題を軽減しますが、 OPTIMIZE
を完全に置き換えるものではありません。 特に 1 TB を超えるテーブルの場合、Databricks では、ファイルをさらに統合するために、スケジュールに従って OPTIMIZE
を実行することをお勧めします。 Databricks ではテーブルに対してZORDER
が自動的に実行されないため、拡張データ スキップを有効にするには、ZORDER
と共に OPTIMIZE
を実行する必要があります。「Delta Lake のデータのスキップ」を参照してください。
Databricks の自動最適化とは
自動最適化 という用語は、 delta.autoOptimize.autoCompact
と delta.autoOptimize.optimizeWrite
の設定によって制御される機能を表すために使用されることがあります。この用語は廃止され、各設定を個別に説明することに置き換えられました。 「Databricks 上の Delta Lake の自動圧縮」と「Databricks 上の Delta Lake の最適化された書き込み」を参照してください。
Databricks での Delta Lake の自動圧縮
自動圧縮は、Deltaテーブルパーティション内の小さなファイルを結合して、小さなファイルの問題を自動的に軽減します。自動圧縮はテーブルへの書き込みが成功した後に発生し、書き込みを実行したクラスター上で同期的に実行されます。自動圧縮では、以前に圧縮されていないファイルのみが圧縮されます。
出力ファイルのサイズを制御するには、 Spark 構成を spark.databricks.delta.autoCompact.maxFileSize
に設定します。 Databricks では、ワークロードまたはテーブル サイズに基づく自動チューニングを使用することをお勧めします。 ワークロードに基づくファイル・サイズの自動チューニングおよびテーブル・サイズに基づくファイル・サイズの自動調整を参照してください。
自動圧縮は、少なくとも一定数の小さなファイルを含むパーティションまたはテーブルに対してのみトリガーされます。オプションで、spark.databricks.delta.autoCompact.minNumFiles
を設定して、自動圧縮をトリガーするために必要なファイルの最小数を変更できます。
自動コンパクションは、以下の設定を使用して、テーブルまたはセッションレベルで有効にできます:
- テーブルプロパティ:
delta.autoOptimize.autoCompact
- SparkSession設定:
spark.databricks.delta.autoCompact.enabled
これらの設定では、次のオプションを使用できます:
オプション | 挙動 |
---|---|
| 他のオートチューニング機能を尊重しながら、ターゲットファイルサイズを調整します。 Databricks Runtime 10.4 LTS 以降が必要です。 |
|
|
| ターゲットファイルサイズとして128 MBを使用します。動的なサイズ設定はありません。 |
| 自動圧縮をオフにします。セッションレベルで設定して、ワークロードで変更されたすべてのDeltaテーブルの自動圧縮をオーバーライドできます。 |
Databricks Runtime 9.1 LTS では、他のライターが DELETE
、 MERGE
、 UPDATE
、 OPTIMIZE
などの操作を同時に実行すると、自動圧縮により、他のジョブがトランザクションの競合で失敗する可能性があります。 これは、Databricks Runtime 10.4 LTS 以降では問題になりません。
Databricks 上の Delta Lake の書き込みの最適化
書き込みが最適化されると、データが書き込まれるときのファイルサイズが改善され、その後のテーブルの読み取りが向上します。
最適化された書き込みは、各パーティションに書き込まれる小さなファイルの数を減らすため、パーティション分割されたテーブルに対して最も効果的です。小さなファイルを多数書き込むよりも、大きなファイルの書き込みを少なくするほうが効率的ですが、データが書き込まれる前にシャッフルされるため、書き込み遅延が増加する可能性があります。
次の図は、最適化された書き込みがどのように機能するかを示しています:
データを書き出す直前に coalesce(n)
または repartition(n)
実行されるコードを使用して、書き込まれるファイルの数を制御する場合があります。 最適化された書き込みにより、このパターンを使用する必要がなくなります。
Databricks Runtime 9.1 LTS以降では、以下のオペレーションで最適化された書き込みがデフォルトで有効になっています:
MERGE
UPDATE
サブクエリー付きDELETE
サブクエリー付き
最適化された書き込みは、ウェアハウスを使用する場合のCTAS
ステートメントおよびINSERT
操作でも有効になります SQL。 Databricks Runtime 13.3 LTS 以降では、Unity Catalog に登録されているすべての Delta テーブルで、パーティション分割されたテーブルの CTAS
ステートメントと INSERT
操作に対して最適化された書き込みが有効になっています。
最適化された書き込みは、次の設定を使用してテーブルレベルまたはセッションレベルで有効にすることができます:
- テーブルセッティング:
delta.autoOptimize.optimizeWrite
- SparkSession設定:
spark.databricks.delta.optimizeWrite.enabled
これらの設定では、次のオプションを使用できます:
オプション | 挙動 |
---|---|
| ターゲットファイルサイズとして128 MBを使用します。 |
| 最適化された書き込みをオフにします。セッションレベルで設定して、ワークロードで変更されたすべてのDeltaテーブルの自動圧縮をオーバーライドできます。 |
ターゲット ファイル サイズを設定する
Delta テーブル内のファイルのサイズを調整する場合は、 テーブル プロパティ の delta.targetFileSize
を目的のサイズに設定します。 このプロパティを設定すると、すべてのデータ レイアウト最適化操作で、指定したサイズのファイルを生成するためのベスト エフォートが試行されます。 ここでの例としては、 最適化 または Z-Order、 自動圧縮、 最適化された書き込みなどがあります。
Unity Catalogで管理されるテーブルとSQLウェアハウス、またはDatabricks Runtime 11.3 LTS以降を使用する場合、OPTIMIZE
コマンドのみがtargetFileSize
設定を尊重します。
テーブルプロパティ |
---|
delta.targetFileSize タイプ:バイト単位以上のサイズ。 ターゲットファイルサイズ。たとえば、 |
既存のテーブルの場合、SQL コマンド ALTER TABLE SET TBL PROPERTIES を使用して、プロパティを設定および設定解除できます。 Spark セッション構成を使用して新しいテーブルを作成するときに、これらのプロパティを自動的に設定することもできます。 詳細については、「 Delta テーブル プロパティ リファレンス 」を参照してください。
ワークロードに基づいてファイルサイズを自動調整します
Databricksでは、Databricks Runtime、Unity Catalog、その他の最適化に関係なく、多くのMERGE
またはDMLオペレーションの対象となるすべてのテーブルに対して、テーブルプロパティdelta.tuneFileSizesForRewrites
をtrue
に設定することをお勧めします。true
に設定すると、テーブルのターゲットファイルサイズがはるかに低いしきい値に設定され、書き込み集中型のオペレーションが高速化されます。
明示的に設定されていない場合、DatabricksはDeltaテーブルに対する以前の10回のオペレーションのうち9回がMERGE
オペレーションであったかどうかを自動的に検出し、このテーブルプロパティをtrue
に設定します。この動作を回避するには、このプロパティを明示的にfalse
に設定する必要があります。
テーブルプロパティ |
---|
delta.tuneFileSizesForRewrite タイプ: |
既存のテーブルの場合、SQL コマンド ALTER TABLE SET TBL PROPERTIES を使用して、プロパティを設定および設定解除できます。 Spark セッション構成を使用して新しいテーブルを作成するときに、これらのプロパティを自動的に設定することもできます。 詳細については、「 Delta テーブル プロパティ リファレンス 」を参照してください。
テーブルサイズに基づくファイルサイズの自動調整
手動チューニングの必要性を最小限に抑えるために、Databricks はテーブルのサイズに基づいて Delta テーブルのファイル サイズを自動的に調整します。 Databricks では、テーブル内のファイル数が増えすぎないように、小さなテーブルには小さなファイル サイズを使用し、大きなテーブルには大きなファイル サイズを使用します。 Databricks は、 特定のターゲット サイズ でチューニングしたテーブルや、頻繁に書き換えられるワークロードに基づいてチューニングしたテーブルを自動調整しません。
ターゲットファイルサイズは、Deltaテーブルの現在のサイズに基づきます。2.56 TB未満のテーブルの場合、自動調整されるターゲットファイルサイズは256 MBです。サイズが2.56 TB~10 TBのテーブルの場合、ターゲットサイズは256 MBから1 GBまで直線的に増加します。10 TBを超えるテーブルの場合、ターゲットファイルサイズは1 GBです。
テーブルのターゲットファイルサイズが大きくなった場合、既存のファイルは、OPTIMIZE
コマンドによってより大きなファイルに再最適化されません。したがって、大きなテーブルには、ターゲットサイズよりも小さいファイルが常に含まれる可能性があります。これらの小さいファイルをさらに大きいファイルに最適化する必要がある場合は、delta.targetFileSize
テーブルプロパティを使用してテーブルの固定ターゲットファイルサイズを構成できます。
テーブルが増分的に書き込まれる場合、ターゲットファイルサイズとファイル数は、テーブルサイズに基づいて次の数値に近くなります。このテーブルのファイル数は単なる例です。実際の結果は、多くの要因によって異なります。
テーブルサイズ | ターゲットファイルサイズ | テーブル内のファイルのおおよその数 |
---|---|---|
10 GB | 256 MB | 40 |
1 TB | 256 MB | 4096 |
2.56 TB | 256 MB | 10240 |
3TB | 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 テーブルの 1 つのファイルに書き込むレコードの最大数を指定します。 値 0 または負の値を指定することは、制限がないことを表します。
Databricks Runtime 11.3 LTS 以降では、DataFrame APIsを使用してDelta Lakeテーブルに書き込むときに、DataFrameWriter オプション maxRecordsPerFile
を使用することもできます。maxRecordsPerFile
を指定すると、SQL セッション構成spark.sql.files.maxRecordsPerFile
の値は無視されます。
Databricksでは、前述のエラーを回避する必要がない限り、このオプションの使用をお勧めしません。この設定は、非常に狭いデータを含む一部のUnity Catalogマネージドテーブルでは引き続き必要になる場合があります。
バックグラウンド自動圧縮へのアップグレード
Unity Catalogバックグラウンド自動圧縮は、Databricks Runtime 11.3LTS 以降の マネージドテーブルで使用できます。レガシーワークロードまたはテーブルを移行する場合は、次の操作を行います。
- クラスターまたはノートブックの構成設定から Spark 構成
spark.databricks.delta.autoCompact.enabled
を削除します。 - テーブルごとに
ALTER TABLE <table_name> UNSET TBLPROPERTIES (delta.autoOptimize.autoCompact)
を実行して、従来の自動圧縮設定を削除します。
これらの従来の設定を削除すると、すべての Unity Catalog マネージドテーブルに対してバックグラウンドの自動圧縮が自動的にトリガーされます。