Original: Seamlessly Migrate Your Apache Parquet Data Lake to Delta Lake
翻訳: junichi.maruyama
Apache Parquet は、今日のビッグデータの世界で最も人気のあるオープンソースのファイルフォーマットの1つです。列指向であるApache Parquetは、データの保存と検索を効率的に行うことができるため、過去10年間に多くの企業がデータレイクにおけるデータ保存の必須方法として採用しました。中には、Apache Parquetファイルを「データベーステーブル」として利用し、CRUD操作を行う企業もあります。しかし、Apache Parquetファイルは単なるデータファイルであり、トランザクションロギング、統計収集、インデックス作成機能を持たないため、ACIDに準拠したデータベース操作には適していません。このようなツールの構築は、膨大な数の開発チームが独自に開発し、それを維持する必要があるため、途方もない作業です。その結果生まれたのが、Apache Parquet Data Lakeです。その場しのぎのソリューションが精一杯で、ACID準拠の脆さから生じるテーブルの偶発的な破損などの問題に悩まされていました。
その解決策として登場したのが、Delta Lakeフォーマットです。これは、Apache Parquetデータレイクが抱えていた問題を正確に解決するために設計されたものです。Apache ParquetがDelta Lakeのベースとなるデータストレージフォーマットとして採用され、不足していたトランザクションロギング、統計収集、インデックス作成機能が組み込まれ、必要なACIDコンプライアンスと保証を提供しました。オープンソースのDelta Lakeは、Linux Foundationのもと、業界で広く利用されるようになり、力強さを増しています。
しかし、データ移行には計画と適切なアプローチの選択が必要です。Delta Lakeにデータを移行した後も、Apache Parquetデータレイクを共存させる必要があるシナリオもあり得ます。例えば、Apache Parquet Data Lakeに格納されたテーブルにデータを書き込むETLパイプラインがある場合、データを徐々にDelta Lakeに移行する前に詳細な影響分析を行う必要があります。その時まで、Apache Parquet Data LakeとDelta Lakeを同期させておく必要があります。このブログでは、いくつかの類似のユースケースを取り上げ、その取り組み方を紹介します。
Delta Lakeの内部機能については、こちらのDatabricks Blog シリーズをご参照ください。
Apache Parquet Data LakeからDelta Lakeへの移行に採用すべき方法は、以下のマトリックスに記載されている1つまたは複数の移行要件に依存します。
Methods ⇩ |
Complete overwrite at source | Incremental with append at source | Duplicates data | Maintains data structure | Backfill data | Ease of use |
---|---|---|---|---|---|---|
Deep CLONE Apache Parquet | Yes | Yes | Yes | Yes | Yes | Easy |
Shallow CLONE Apache Parquet | Yes | Yes | No | Yes | Yes | Easy |
CONVERT TO DELTA | Yes | No | No | Yes | No | Easy |
Auto Loader | Yes | Yes | Yes | No | Optional | Some configuration |
Batch Apache Spark job | Custom logic | Custom logic | Yes | No | Custom logic | Custom logic |
COPY INTO | Yes | Yes | Yes | No | Optional | Some configuration |
表1 - マイグレーションの選択肢を示すマトリックス
それでは、マイグレーション要件と、それがマイグレーション手法の選択にどのような影響を与えるかについて説明します。
Databricks のdeep clone 機能を使用して、Apache Parquet Data lake から Delta Lake にデータを段階的に変換することができます。この方法は、以下の条件をすべて満たす場合に使用します:
Databricks のshallow clone機能を使用して、Apache Parquet Data lake から Delta Lake へデータをインクリメンタルに変換することができます:
以下のような要件がある場合、Convert to Delta Lake 機能を使用することができます:
ソースはインプレースでターゲットの Delta Lake テーブルに変換されるため、ターゲットテーブルに対する今後のすべての CRUD 操作は、Delta Lake ACID トランザクションを通じて行われる必要があります。
注意 - CONVERT TO DELTA オプションを使用する前に、注意事項を参照してください。変換処理中にデータファイルの更新や追加を行うことは避けるべきです。テーブルが変換された後、すべての書き込みがDelta Lakeを経由することを確認してください。
Auto Loaderを使用すると、指定されたクラウドストレージディレクトリからターゲットDeltaテーブルにすべてのデータをインクリメンタルにコピーすることができます。この方法は、以下のような場合に使用できます:
COPY INTO SQLコマンドを使用すると、指定されたクラウドストレージディレクトリからターゲットDeltaテーブルにすべてのデータをインクリメンタルにコピーすることができます。この方法は、以下のような条件で使用することができます:
Auto LoaderとCOPY INTOのどちらも、データ移行プロセスを設定するための豊富なオプションが用意されています。COPY INTOとAuto Loaderのどちらかを選択する必要がある場合は、こちらのリンクを参照してください。
最後に、カスタムApache Sparkロジックを使用してDelta Lakeに移行することができます。これは、ソースシステムから異なるデータを移行する方法とタイミングを制御する大きな柔軟性を提供しますが、ここで説明した他の方法論にすでに組み込まれている機能を提供するために、大規模な構成とカスタマイズが必要になる場合があります。
バックフィルや増分移行を行うには、データソースのパーティション構造に頼ることができるかもしれませんが、最後にソースからデータをロードしてからどのファイルが追加されたかを追跡するカスタムロジックを記述する必要があるかもしれません。Delta Lakeのマージ機能を使用すれば、重複したレコードの書き込みを避けることができますが、大きなParquetソーステーブルのすべてのレコードと大きなDeltaテーブルの内容を比較することは、複雑で計算量の多いタスクです。
Apache Parquet Data LakeをDelta Lakeに移行する方法論の詳細については、このlinkを参照してください。
このブログでは、Apache Parquet Data LakeをDelta Lakeに移行するためのさまざまなオプションについて説明し、要件に基づいて正しい手法を決定する方法について説明しました。Apache ParquetからDelta Lakeへの移行の詳細と開始方法については、ガイド(AWS, Azure, GCP)を参照してください。このNotebooksでは、移行を開始し、さまざまなオプションを試すことができるように、いくつかの例を提供しています。また、Delta Lakeに移行した後は、Databricksの最適化ベストプラクティスに従うことを常に推奨します。