データファイルサイズを制御するようにDelta Lakeを構成する
注
この記事の推奨事項は、Unity Catalog で管理されるテーブルには適用されません。 Databricks では、すべての新しい Delta テーブルに対して、デフォルト設定で Unity Catalog マネージドテーブルを使用することをお勧めします。
Databricks Runtime 13.3 以降では、Databricks では、テーブル レイアウトDeltaクラスターを使用することをお勧めします。「 Deltaテーブルにリキッドクラスタリング使用する」を参照してください。
Databricks では、予測的最適化を使用して、 Delta テーブルのOPTIMIZE
とVACUUM
を自動的に実行することをお勧めします。 予測的最適化 for 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
。この用語は廃止され、各設定を個別に説明できるようになりました。 Databrick s で の Delt a Lake の自動圧 縮 およ び Databrick s で の Delt a 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
サブクエリー付き
SQLウェアハウスを使用する場合、 CTAS
ステートメントとINSERT
操作に対しても最適化された書き込みが有効になります。 Databricks Runtime 13.3 LTS 以降では、Unity Catalog に登録されているすべての Delta テーブルで、パーティション分割されたテーブルのCTAS
ステートメントとINSERT
操作に対して最適化された書き込みが有効になっています。
最適化された書き込みは、次の設定を使用してテーブルレベルまたはセッションレベルで有効にすることができます:
テーブルセッティング:
delta.autoOptimize.optimizeWrite
SparkSession設定:
spark.databricks.delta.optimizeWrite.enabled
これらの設定では、次のオプションを使用できます:
オプション |
挙動 |
---|---|
|
ターゲットファイルサイズとして128 MBを使用します。 |
|
最適化された書き込みをオフにします。セッションレベルで設定して、ワークロードで変更されたすべてのDeltaテーブルの自動圧縮をオーバーライドできます。 |
目標ファイルサイズを設定する
Delta テーブル内のファイルのサイズを調整する場合は、 table プロパティ delta.targetFileSize
を目的のサイズに設定します。 このプロパティが設定されている場合、すべてのデータ レイアウト最適化操作は、指定されたサイズのファイルを生成するためにベスト エフォートを試みます。 ここでの例には、 最適化 または Z オーダー、 自動圧縮、 最適化された書き込みなどがあります。
注
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 つのファイルに書き込むレコードの最大数を指定します。 ゼロまたは負の値を指定すると、制限はありません。
Databricks Runtime 11.3 LTS以降では、 DataFrame APIs使用してDelta Lakeテーブルに書き込むときに、DataFrameWriter オプション maxRecordsPerFile
を使用することもできます。 maxRecordsPerFile
が指定されている場合、SQL セッション構成spark.sql.files.maxRecordsPerFile
の値は無視されます。
注
Databricksでは、前述のエラーを回避する必要がない限り、このオプションの使用をお勧めしません。この設定は、非常に狭いデータを含む一部のUnity Catalogマネージドテーブルでは引き続き必要になる場合があります。
バックグラウンド自動圧縮へのアップグレード
バックグラウンド自動圧縮は、Databricks Runtime 11.3 LTS 以降の Unity Catalog マネージド テーブルで使用できます。 レガシーワークロードまたはテーブルを移行する場合は、次の操作を行います。
クラスターまたはノートブックの構成設定から Spark 構成
spark.databricks.delta.autoCompact.enabled
を削除します。テーブルごとに
ALTER TABLE <table_name> UNSET TBLPROPERTIES (delta.autoOptimize.autoCompact)
を実行して、従来の自動圧縮設定をすべて削除します。
これらのレガシ構成を削除すると、すべての Unity Catalog マネージド テーブルに対してバックグラウンド自動圧縮が自動的にトリガーされます。