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

データファイルサイズを制御する

注記

この記事の手動チューニングの推奨事項は、自動ファイルサイズチューニングを使用するUnity Catalogマネージドテーブルには適用されません。新しいテーブルには、デフォルト設定で Unity Catalog マネージドテーブルを使用してください。

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

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

Databricks Runtime 10.4 LTS 以降では、自動コンパクションと最適化された書き込みは、MERGEUPDATE、およびDELETEの操作で常に有効になっています。この機能は無効にできません。

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

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

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

実行タイミング: OPTIMIZE

自動圧縮と最適化された書き込みは、それぞれ小さなファイルの問題を軽減しますが、OPTIMIZEの完全な代替ではありません。特に 1 TB を超えるテーブルの場合、Databricks では、ファイルをさらに統合するために、スケジュールに従って OPTIMIZE を実行することをお勧めします。Databricks では、強化されたデータスキップのためにリキッドクラスタリングを推奨しています。リキッドクラスタリングが有効になっている場合、OPTIMIZE はクラスタリングキーによってデータを自動的に再編成します。「テーブルにリキッドクラスタリングを使用する」を参照してください。

Unity Catalog マネージドテーブルの場合、予測的最適化は、予測的最適化が有効になっているテーブルに対して OPTIMIZE を自動的に実行します。

Databricksの自動最適化とは?

自動最適化 」という用語は、autoOptimize.autoCompactautoOptimize.optimizeWrite の設定によって制御される機能を表すために使用されることがあります。この用語は廃止され、各設定を個別に説明することに置き換えられました。自動圧縮最適化された書き込みを参照してください。

オートコンパクト

自動圧縮は、テーブルパーティション内の小さなファイルを結合して、小さなファイルの問題を軽減します。書き込みが成功した後、書き込みを実行したクラスター上で同期的に実行され、以前に圧縮されていないファイルのみを圧縮します。

自動圧縮と予測的最適化は、個別に、または一緒に利用できる独立した機能です。自動圧縮は、書き込みを実行しているクラスター上で実行されますが、予測的最適化は、サーバレスコンピュートを使用して非同期でメンテナンス操作を実行します。

自動コンパクションを設定するには、以下の設定を使用します。

設定

Delta

Iceberg

説明

自動圧縮を有効にする(テーブルプロパティ)

autoOptimize.autoCompact

autoOptimize.autoCompact

テーブルレベルで自動圧縮を有効にします。

自動圧縮を有効にする(Spark セッション)

spark.databricks.delta.autoCompact.enabled

spark.databricks.iceberg.autoCompact.enabled

セッションレベルで自動コンパクションを有効にできます。

最大出力ファイルサイズ

spark.databricks.delta.autoCompact.maxFileSize

spark.databricks.iceberg.autoCompact.maxFileSize

ターゲットファイルサイズを制御します。

圧縮をトリガーする最小ファイル数

spark.databricks.delta.autoCompact.minNumFiles

spark.databricks.iceberg.autoCompact.minNumFiles

パーティションまたはテーブルで自動圧縮をトリガーするために必要となる小さなファイルの最小数を設定します。

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

オプション

挙動

auto (推奨)

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

legacy

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

true

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

false

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

注記

Databricks は、テーブルサイズに基づいた自動チューニングを使用して、出力ファイルサイズを制御することを推奨しています。「テーブルサイズに基づいてファイルサイズを自動調整します」を参照してください。

最適化された書き込み

書き込みが最適化されると、データが書き込まれるときのファイルサイズが改善され、その後のテーブルの読み取りが向上します。

最適化された書き込みは、各パーティションに書き込まれる小さなファイルの数を減らすため、パーティション分割されたテーブルに対して最も効果的です。小さなファイルを多数書き込むよりも、大きなファイルの書き込みを少なくするほうが効率的ですが、データが書き込まれる前にシャッフルされるため、書き込み遅延が増加する可能性があります。

次の図は、最適化された書き込みがどのように機能するかを示しています:

最適化された書き込み

注記

書き込まれるファイル数を制御するために、データを書き出す直前にcoalesce(n)またはrepartition(n)を実行するコードがある場合があります。最適化された書き込みでは、このパターンの使用が不要になります。

Databricks Runtime 9.1 LTS以降では、以下のオペレーションで最適化された書き込みがデフォルトで有効になっています:

  • MERGE
  • UPDATE サブクエリー付き
  • DELETE サブクエリー付き

SQLウェアハウスを使用する場合、最適化された書き込みは、CTASステートメントとINSERTオペレーションに対しても有効になります。Databricks Runtime 13.3 LTS 以降では、Unity Catalogに登録されているすべてのテーブルで、パーティション分割テーブルのCTASステートメントとINSERTオペレーションに対して最適化された書き込みが有効になっています。

最適化された書き込みは、次の設定を使用してテーブルレベルまたはセッションレベルで有効にすることができます:

  • テーブルプロパティ: autoOptimize.optimizeWrite
  • SparkSession設定:spark.databricks.delta.optimizeWrite.enabled(Delta)またはspark.databricks.iceberg.optimizeWrite.enabled(Iceberg)

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

オプション

挙動

true

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

false

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

目標ファイルサイズを設定する

テーブル内のファイルのサイズをチューニングする場合は、テーブルプロパティ targetFileSize を希望のサイズに設定します。設定されている場合、すべてのデータレイアウトの最適化操作では、最適化リキッドクラスタリング自動コンパクション、および最適化された書き込みなど、指定されたサイズでのファイル生成をベストエフォートで試みます。

注記

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

属性

説明

delta.targetFileSize (Delta)

iceberg.targetFileSize (Iceberg)

タイプ:バイト単位以上のサイズ。

説明 :ターゲットファイルサイズ。たとえば、104857600(バイト)や100mbなどです。

デフォルト値 : なし

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

テーブルサイズに基づいてファイルサイズを自動調整します

手動チューニングの必要性を最小限に抑えるために、Databricks ではテーブルのサイズに基づいてテーブルのファイルサイズを自動的にチューニングします。Databricks は、テーブル内のファイル数が大きくなりすぎないように、テーブルが小さい場合はファイルサイズを小さくし、テーブルが大きい場合はファイルサイズを大きくします。Databricks は、特定のターゲットサイズでチューニングされたテーブルに対して、自動チューニングを行いません。

ターゲットファイルサイズは、テーブルの現在のサイズに基づきます。2.56 TB未満のテーブルの場合、自動調整されるターゲットファイルサイズは256 MBです。サイズが2.56 TB~10 TBのテーブルの場合、ターゲットサイズは256 MBから1 GBまで直線的に増加します。10 TBを超えるテーブルの場合、ターゲットファイルサイズは1 GBです。

注記

テーブルのターゲットファイルサイズが大きくなった場合、既存のファイルは、OPTIMIZEコマンドによってより大きなファイルに再最適化されません。したがって、大きなテーブルには、ターゲットサイズよりも小さいファイルが常に含まれる可能性があります。これらの小さいファイルをさらに大きいファイルに最適化する必要がある場合は、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を使用して、テーブルの1つのファイルに書き込むレコードの最大数を指定します。ゼロまたは負の値を指定することは、制限がないことを表します。

Databricks Runtime 11.3 LTS 以降では、DataFrame APIs を使用してテーブルに書き込むときに、DataFrameWriter オプション maxRecordsPerFile を使用することもできます。maxRecordsPerFileを指定した場合、SQLセッション構成の値spark.sql.files.maxRecordsPerFileは無視されます。

注記

Databricksでは、前述のエラーを回避する必要がない限り、このオプションの使用をお勧めしません。この設定は、非常に狭いデータを含む一部のUnity Catalogマネージドテーブルでは引き続き必要になる場合があります。

バックグラウンド自動圧縮へのアップグレード

Databricks Runtime 11.3 LTS 以降のUnity Catalog マネージドテーブルでは、バックグラウンド自動圧縮が利用可能です。バックグラウンドの自動圧縮には予測的最適化は必要ありません。レガシー ワークロードまたはテーブルを移行するときは、次の手順を実行してください:

  1. クラスターまたはノートブックの構成設定から Spark 構成 spark.databricks.delta.autoCompact.enabled (Delta) または spark.databricks.iceberg.autoCompact.enabled (Iceberg) を削除します。
  2. 以前の自動圧縮設定をすべて削除するには、各テーブルでALTER TABLE <table_name> UNSET TBLPROPERTIES (delta.autoOptimize.autoCompact) (Delta) または ALTER TABLE <table_name> UNSET TBLPROPERTIES (iceberg.autoOptimize.autoCompact) (Iceberg) を実行してください。

これらのレガシー構成を削除すると、すべてのUnity Catalog マネージドテーブルでバックグラウンドでの自動圧縮が自動的にトリガーされることが確認できます。