メインコンテンツまでスキップ

Delta Lake を構成してデータ ファイルのサイズを制御する

注記

この記事の推奨事項は、Unity Catalog で管理されるテーブルには適用されません。 Databricks では、すべての新しい Delta テーブルに対して、デフォルト設定で Unity Catalog マネージドテーブルを使用することをお勧めします。

Databricks Runtime 13.3 以降では、Databricks では Delta テーブル レイアウトにクラスタリングを使用することをお勧めします。「テーブルにリキッドクラスタリングを使用する」を参照してください。

Databricks では、予測的最適化を使用して、 Delta テーブルのOPTIMIZEVACUUMを自動的に実行することをお勧めします。 Unity Catalog マネージドテーブルの予測的最適化を参照してください。

Databricks Runtime 10.4 LTS 以降では、 MERGEUPDATEDELETE の各操作で、自動圧縮と最適化された書き込みが常に有効になっています。 この機能は無効にできません。

Delta Lakeは、書き込みとOPTIMIZEオペレーションのターゲットファイルサイズを手動または自動で設定するオプションを提供します。Databricksは、これらの設定の多くを自動的に調整し、適切なファイルサイズを追求することによってテーブルのパフォーマンスを自動的に向上させる機能を有効にします。

Unity Catalogマネージドテーブルの場合、Databricks SQLウェアハウスまたはDatabricks Runtime 11.3 以降を使用している場合、LTS はこれらの構成のほとんどを自動的に調整します。

Databricks Runtime 10.4 LTS 以下からワークロードをアップグレードする場合は、「 バックグラウンド自動圧縮へのアップグレード」を参照してください。

実行タイミング: OPTIMIZE

自動圧縮と最適化された書き込みは、それぞれ小さなファイルの問題を軽減しますが、 OPTIMIZEを完全に置き換えるものではありません。 特に 1 TB を超えるテーブルの場合、Databricks では、ファイルをさらに統合するために、スケジュールに従って OPTIMIZE を実行することをお勧めします。 Databricks ではテーブルに対してZORDERが自動的に実行されないため、拡張データ スキップを有効にするには、ZORDER と共に OPTIMIZE を実行する必要があります。Delta Lake のデータのスキップを参照してください。

Databricks の自動最適化とは

自動最適化 という用語は、 delta.autoOptimize.autoCompactdelta.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

これらの設定では、次のオプションを使用できます:

オプション

挙動

auto (推奨)

他のオートチューニング機能を尊重しながら、ターゲットファイルサイズを調整します。 Databricks Runtime 10.4 LTS 以降が必要です。

legacy

trueのエイリアス。Databricks Runtime 10.4 LTS 以降が必要です。

true

ターゲットファイルサイズとして128 MBを使用します。動的なサイズ設定はありません。

false

自動圧縮をオフにします。セッションレベルで設定して、ワークロードで変更されたすべてのDeltaテーブルの自動圧縮をオーバーライドできます。

important

Databricks Runtime 9.1 LTS では、他のライターが DELETEMERGEUPDATEOPTIMIZE などの操作を同時に実行すると、自動圧縮により、他のジョブがトランザクションの競合で失敗する可能性があります。 これは、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

これらの設定では、次のオプションを使用できます:

オプション

挙動

true

ターゲットファイルサイズとして128 MBを使用します。

false

最適化された書き込みをオフにします。セッションレベルで設定して、ワークロードで変更されたすべてのDeltaテーブルの自動圧縮をオーバーライドできます。

ターゲット ファイル サイズを設定する

Delta テーブル内のファイルのサイズを調整する場合は、 テーブル プロパティdelta.targetFileSize を目的のサイズに設定します。 このプロパティを設定すると、すべてのデータ レイアウト最適化操作で、指定したサイズのファイルを生成するためのベスト エフォートが試行されます。 ここでの例としては、 最適化 または Z-Order自動圧縮最適化された書き込みなどがあります。

注記

Unity Catalogで管理されるテーブルとSQLウェアハウス、またはDatabricks Runtime 11.3 LTS以降を使用する場合、OPTIMIZEコマンドのみがtargetFileSize設定を尊重します。

テーブルプロパティ

delta.targetFileSize タイプ:バイト単位以上のサイズ。 ターゲットファイルサイズ。たとえば、104857600(バイト)や100mbなどです。 デフォルト値: なし

既存のテーブルの場合、SQL コマンド ALTER TABLE SET TBL PROPERTIES を使用して、プロパティを設定および設定解除できます。 Spark セッション構成を使用して新しいテーブルを作成するときに、これらのプロパティを自動的に設定することもできます。 詳細については、「 Delta テーブル プロパティ リファレンス 」を参照してください。

ワークロードに基づいてファイルサイズを自動調整します

Databricksでは、Databricks Runtime、Unity Catalog、その他の最適化に関係なく、多くのMERGEまたはDMLオペレーションの対象となるすべてのテーブルに対して、テーブルプロパティdelta.tuneFileSizesForRewritestrueに設定することをお勧めします。trueに設定すると、テーブルのターゲットファイルサイズがはるかに低いしきい値に設定され、書き込み集中型のオペレーションが高速化されます。

明示的に設定されていない場合、DatabricksはDeltaテーブルに対する以前の10回のオペレーションのうち9回がMERGEオペレーションであったかどうかを自動的に検出し、このテーブルプロパティをtrueに設定します。この動作を回避するには、このプロパティを明示的にfalseに設定する必要があります。

テーブルプロパティ

delta.tuneFileSizesForRewrite タイプ: Boolean データレイアウトを最適化するためにファイルサイズを調整するかどうか。 デフォルト値: なし

既存のテーブルの場合、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 以降では、データフレーム APIを使用してDelta Lakeテーブルに書き込むときに、データフレームWriter オプション 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 マネージドテーブルに対してバックグラウンドの自動圧縮が自動的にトリガーされます。