Parquet データ レイクを Delta Lake に移行する
この記事では、既存の Parquet データ レイクを Delta Lake に変換するための推奨事項について説明します。 Delta Lake は、Databricks レイクハウスの基になる形式です。 「Delta Lake とは」を参照してください。
Delta Lake に変換する前の考慮事項
Parquet データ レイクには、既存のワークロードやシステムに合わせて最適化されたパーティション分割戦略がある可能性があります。 Delta Lake に変換してもこのパーティション構造を維持することはできますが、過剰にパーティション分割されたテーブルは、Delta Lake でワークロードが遅くなる主な原因の 1 つとなっています。 「Azure Databricks でテーブルをパーティション分割するタイミング」と、Spark コードを Databricks に適合させるためのガイドラインに関するページを参照してください。
また、変換されるデータが引き続き増えるかどうか、現在どの程度の頻度でデータのクエリが実行されているかも考慮する必要があります。 データ レイクの Parquet テーブルごとに異なる方法を選択することが可能です。
Delta Lake 変換のアプローチ
次のマトリックスは、Parquet データ レイクを Delta Lake に変換するための 4 つの主なアプローチと、いくつかのトレードオフを示しています。 各列を明確にするために、以下について説明します。
- 増分: 変換開始後に変換元に追加されたデータの変換をサポートする機能を指します。
- データの複製: データが新しい場所に書き込まれるか、特定の場所で変更されるかを示します。
- データ構造の維持: 変換時にパーティション分割戦略が維持されるかどうかを示します。
- データのバックフィル: 変換開始後に変換元に追加されたデータのバックフィルをサポートする機能を指します。
- 使いやすさ: データ変換の構成や実行にかかるユーザーの労力の程度を示します。
Method | 増分 | データの複製 | データ構造の維持 | データのバックフィル | 使いやすさ |
---|---|---|---|---|---|
ディープ CLONE Parquet |
はい | イエス | イエス | はい | 簡単 |
シャロー CLONE Parquet |
はい | いいえ | イエス | はい | 簡単 |
CONVERT TO DELTA |
いいえ | 番号 | 有効 | いいえ | 簡単 |
自動ローダー | はい | はい | × | 省略可能 | 一部の構成 |
Batch Spark ジョブ | カスタム ロジック | はい | いいえ | カスタム ロジック | カスタム ロジック |
次のセクションでは、これらのオプションについてそれぞれ詳しく説明します。
CLONE
Parquet を使用して Parquet データを移行する
CLONE
Parquet を使用して、Parquet データ レイクから Delta Lake にデータを増分コピーできます。 シャロー クローンでは、既存の Parquet ファイルへのポインターが作成され、Parquet テーブルを元の場所と形式で維持しながら、収集されたファイル統計にもとづき最適化されたアクセスが得られます。 元のデータ ソースに影響を与えることなく、シャロー クローンによって作成されたテーブルに書き込むことができます。
ディープ クローンでは、Delta Lake への変換中に、ソースから新しい場所にすべてのデータ ファイルがコピーされます。 ディープ クローンを利用すると、このロジックの後続の実行時に、バックフィル操作を含む新しいファイルを段階的に検出することができます。 「Parquet テーブルと Iceberg テーブルを Delta Lake に増分複製する」を参照してください。
CLONE
の使用例を次に示します。
CREATE OR REPLACE TABLE <target-table-name> [SHALLOW] CLONE parquet.`/path/to/data`;
CONVERT TO DELTA
を使用して Parquet データを移行する
CONVERT TO DELTA
を使用すると、Parquet ファイルのディレクトリを 1 つのコマンドで Delta テーブルに変換できます。 テーブルを Delta Lake に変換したら、Parquet ロジックを使用したテーブルの読み取りと書き込みを停止する必要があります。 変換開始後にターゲット ディレクトリに書き込まれたデータは、変換後の Delta テーブルに反映されない可能性があります。 「Delta Lake に変換する」を参照してください。
CONVERT TO DELTA
の使用例を次に示します。
CONVERT TO DELTA parquet.`abfss://container@storageAccount.dfs.core.windows.net/parquet-data`;
自動ローダーを使用して Parquet データを移行する
自動ローダーはクラウド オブジェクト ストレージからの増分データ インジェストを目的とした製品ですが、これを活用すれば、特定のディレクトリからターゲット テーブルにすべてのデータを増分コピーするパターンを実装することができます。 「自動ローダー」を参照してください。
以下のコード例には、次のような構成が含まれています。
- ソース ディレクトリ内のすべての既存ファイルを処理する。
- 毎週自動でバックフィル ジョブをトリガーして、見逃された可能性のあるファイルをキャプチャする。
- Apache Spark で多数の Spark ジョブを使用できるようにし、大規模なデータ パーティションに関連するスピルやメモリ不足のエラーを回避する。
- エンドツーエンドの厳密に 1 回の処理が保証されるようにする。
(spark.readStream
.format("cloudFiles")
.option("cloudFiles.format", "parquet")
.option("cloudFiles.includeExistingFiles", "true")
.option("cloudFiles.backfillInterval", "1 week")
.option("cloudFiles.schemaLocation", checkpoint_path)
.load(file_path)
.writeStream
.option("checkpointLocation", checkpoint_path)
.trigger(availableNow=True)
.toTable(table_name)
)
Delta Live Tables では、Python または SQL で自動ローダーを使用できます:
カスタム Apache Spark バッチ ロジックを使用して Parquet データを移行する
カスタム Apache Spark ロジックを記述すると、ソース システムから異なるデータを移行する方法とタイミングを柔軟に制御できますが、他のアプローチに組み込まれた機能を使用するには広範な構成が必要になる場合があります。
このアプローチの中核となるのは、次のような単純な Apache Spark の読み取りおよび書き込み操作です。
spark.read.format("parquet").load(file_path).write.mode("append").saveAsTable(table_name)
バックフィルや段階的移行を行うには、データ ソースのパーティション分割構造に依存できる場合もありますが、ソースから最後にデータを読み込んだ後に追加されたファイルを追跡するためのカスタム ロジックを記述する必要がある場合もあります。 Delta Lake のマージ機能を使用すれば重複するレコードの書き込みを防ぐことができますが、大きな Parquet ソース テーブルのすべてのレコードと大きな Delta テーブルのコンテンツを比較することは、計算コストの高いタスクです。
Delta Lake に変換すべきでない場合
既存のすべての Parquet データを Delta Lake に変換する前に、潜在的なトレードオフを検討することが推奨されます。
Azure Databricks は Delta Lake を中心にレイクハウスの多くの最適化された機能を整備しており、Delta Lake では、さまざまな言語とエンタープライズ データ システム用のネイティブ コネクタを備えた豊富なオープンソース エコシステムが提供されます。 Delta Sharing では、Delta Lake に保存されているデータを他のクライアントと共有する機能が拡張されます。
Delta Lake は Parquet 上に構築されているため、Azure Databricks は Parquet ファイルの操作に最適化されたリーダーとライターも備えています。
Databricks では、Azure Databricks から定期的に更新やクエリを受け取るすべてのテーブルに Delta Lake を使用することをお勧めします。 次のような場合は、Parquet 形式でデータを保持することを選択できます。
- Parquet にデータを書き込むアップストリーム システムで、Delta Lake へのネイティブ書き込みがサポートされていない。
- Parquet データを読み取るダウンストリーム システムで、Delta Lake を読み取ることができない。
いずれの場合も、テーブルを Delta Lake にレプリケートすることで、テーブル内のレコードの読み取り、書き込み、更新、削除時にパフォーマンス上のメリットを得ることができます。