データファイルサイズを制御するようにDelta Lakeを構成する

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

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

Databricks Runtime 10.4 LTS 以降では、自動圧縮と最適化された書き込みは、 MERGEUPDATE、および DELETE 操作に対して常に有効になっています。この機能を無効にすることはできません。

特に指定がない限り、この記事のすべての推奨事項は、最新のランタイムを実行しているUnity Catalogで管理されるテーブルには適用されません。

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.autoCompactdelta.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

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

オプション

挙動

auto (推奨)

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

legacy

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

true

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

false

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

重要

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 サブクエリー付き

SQLウェアハウスを使用する場合、 CTASステートメントとINSERT操作に対しても最適化された書き込みが有効になります。 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 テーブル内のファイルのサイズを調整する場合は、 table プロパティ delta.targetFileSize を目的のサイズに設定します。 このプロパティが設定されている場合、すべてのデータ レイアウト最適化操作は、指定されたサイズのファイルを生成するためにベスト エフォートを試みます。 ここでの例には、 最適化 または Z オーダー自動圧縮最適化された書き込みなどがあります。

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 つのファイルに書き込むレコードの最大数を指定します。 ゼロまたは負の値を指定すると、制限はありません。

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 マネージド テーブルに対してバックグラウンド自動圧縮が自動的にトリガーされます。