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

ベスト プラクティス: Delta Lake

この記事では、Delta Lakeを使用する際のベストプラクティスについて説明します。

ベスト プラクティスの概要​

以下は、ほとんどの Delta Lake ワークロードに適用される一般的な推奨事項です。

従来の Delta 構成の削除​

Databricks では、新しい Databricks Runtime バージョンにアップグレードするときに、Spark 構成とテーブル プロパティから最も明示的なレガシ Delta 構成を削除することをお勧めします。 従来の構成では、Databricks によって導入された新しい最適化とデフォルト値が移行されたワークロードに適用されない可能性があります。

コンパクトファイル​

Unity Catalog マネージドテーブルにおいては、予測的最適化は自動的に OPTIMIZE と VACUUM コマンドを実行します。Unity Catalog マネージドテーブルの予測的最適化を参照してください。

Databricks では、小さなファイルを圧縮するために OPTIMIZE コマンドを頻繁に実行することをお勧めします。

注記

この操作では、古いファイルは削除されません。 これらを削除するには、vacuum コマンドを実行します。

Delta Lake で Spark キャッシュを使用しない​

Databricks では、次の理由から Spark キャッシュの使用はお勧めしません。

  • キャッシュされたDataFrameの上に追加された追加のフィルターによって発生する可能性のあるデータスキップにより、データが失われます。
  • キャッシュされるデータは、テーブルが異なる識別子を使用してアクセスされた場合、更新されない可能性があります。

Delta Lake と Apache Spark の Parquet の違い​

Delta Lakeは以下のオペレーションを自動的に処理します。これらのオペレーションを手動で実行しないでください:

  • REFRESH TABLE :Delta Lake テーブルは常に最新の情報を返すため、変更後に手動でREFRESH TABLE を呼び出す必要はありません。
  • パーティションの追加と削除 :Delta Lakeは、テーブルにあるパーティションのセットを自動的に追跡し、データが追加または削除されるとリストを更新します。そのため、ALTER TABLE [ADD|DROP] PARTITIONまたはMSCKを実行する必要はありません。
  • 1 つのパーティションをロードする : パーティションを直接読み取る必要はありません。たとえば、 spark.read.format("parquet").load("/data/date=2017-01-01")を実行する必要はありません。代わりに、データのスキップには spark.read.table("<table-name>").where("date = '2017-01-01'")などの WHERE 句を使用します。
  • データファイルを手動で変更しないでください :Delta Lakeはトランザクションログを使用して、テーブルへの変更をアトミックにコミットします。データの損失やテーブルの破損につながる可能性があるため、Delta Lakeテーブル内でParquetデータファイルを直接変更、追加、削除しないでください。

Delta Lake マージのパフォーマンスを向上させる​

マージにかかる時間を短縮するには、次の方法を使用します。

  • 一致の検索スペースを縮小 :デフォルトでは、merge オペレーションはソーステーブルで一致を見つけるために Delta Lake テーブル全体を検索します。mergeを高速化する一つの方法は、マッチ条件に既知の制約を追加して探索空間を縮小することです。たとえば、countryとdateでパーティション化されたテーブルがあり、mergeを使用して最終日と特定の国の情報を更新します。以下の条件を追加すると、関連するパーティションでのみマッチを検索するため、クエリーがより高速になります:

    SQL
    events.date = current_date() AND events.country = 'USA'

    さらに、このクエリにより、他の並列操作との競合の可能性も低減されます。 詳細については、 「分離レベルと書き込み競合」を参照してください。

  • ファイルをコンパクトに : データが多数の小さなファイルに保存されている場合、データを読み取って一致を検索するのが遅くなる可能性があります。 小さなファイルを大きなファイルに圧縮して、読み取りスループットを向上させることができます。 詳細については、「 データ ファイルのレイアウトの最適化 」を参照してください。

  • 書き込み用のシャッフルパーティションを制御する :mergeオペレーションはデータを複数回シャッフルして、更新されたデータを計算して書き込みます。シャッフルに使用されるタスクの数は、Sparkセッション構成spark.sql.shuffle.partitionsによって制御されます。このパラメーターを設定すると、並列処理が制御されるだけでなく、出力ファイルの数も決まります。値を増やすと並列処理が増加しますが、より多くの小さなデータファイルが生成されます。

  • 最適化された書き込みを有効にする : パーティション化されたテーブルの場合、 mergeシャッフル パーティションの数よりもはるかに多くの小さなファイルを生成できます。これは、すべてのシャッフル タスクが複数のパーティションに複数のファイルを書き込む可能性があり、パフォーマンスのボトルネックになる可能性があるためです。最適化された書き込みを有効にすると、ファイル数を減らすことができます。最適化された書き込みを参照してください。

  • テーブル内のファイルサイズを調整する :Databricksはテーブルサイズに基づいてファイルサイズを自動的に調整し、小さいテーブルには小さいファイルを、大きいテーブルには大きいファイルを使用します。詳細については、ファイルサイズの調整に関するセクションを参照してください。

  • Low Shuffle Merge : Low Shuffle Merge は、 MERGEの最適化された実装を提供し、一般的なワークロードのほとんどでより優れたパフォーマンスを実現します。さらに、変更されていないデータに対して、リキッドクラスタリングなどの既存のデータレイアウト最適化を維持します。