見出し画像

データエンジニアが知っておくべきDelta Lakeのしくみ

データ管理の課題とDelta Lakeの登場

 クラウドオブジェクトストレージ(例:Amazon S3、Google Cloud Storage)は、HDFSに代わるデータレイクの実装として広く利用されているように思います。これらのストレージは、無制限のスケール、従量課金制、耐久性、信頼性といった利点を提供しますが、ACIDトランザクションや高性能を実現することが難しいという課題がありました。例えば、一貫性の保証が限定的であり、部分的な更新が可視化されるリスクがありました。

 こうした課題を解決するために登場したのが、Delta Lakeです。Databricksが開発したData Lake Table Formatとそのフレームワークです。2022年6月に、OSSの発表があり、その後広く利用されています。Apache icebergと比較されることもあり、機会があればicebergについてもそのうち紹介したいと思います。

Delta Lakeは、クラウドオブジェクトストレージ上でACIDトランザクションを実現し、高性能なデータ管理を可能にするストレージフレームワークです。 Delta Lakeはオープンソースで提供されており、オンプレミスやクラウド環境を問わず様々なシステムで運用が可能です。そして、データレイクとデータウェアハウス(DWH)の課題を解決するデータ管理における新たなオープンアーキテクチャであるData Lakehouseを構築するための重要な技術要素となっています。

引用: https://www.databricks.com/sites/default/files/2020/12/cidr_lakehouse.pdf

Delta Lakeの特徴

データの信頼性と品質を担保するストレージレイヤー

 Delta Lakeは、従来のデータレイクの柔軟性に加え、データベースのACID特性を取り入れたストレージレイヤーです。この技術により、データの信頼性や整合性を維持しながら、スケーラブルなデータ管理が可能となります。Delta Lakeでは、Parquetファイルとトランザクションログ(Delta Log)によりデータを管理します。

ACIDトランザクションのサポート

 Delta Lakeは、Atomicity、Consistency、Isolation、Durability(ACID)の各特性を完全にサポートし、高いデータ整合性を維持します。これにより、複雑なデータ操作も安全に実行でき、従来のトランザクション データベースの有効な代替手段として活用されています。

バッチ処理とストリーミング処理の統合

 Delta Lakeは、トランザクションログにより、ストリーミング処理でリアルタイムにデータを書き込む場合でも、バッチ処理で一貫したデータ処理が可能です。具体的には、ストリーミング処理では、小さなデータファイルが頻繁に生成されますが、こうした小さなデータファイルはバッチ処理の際には、パフォーマンス上の問題になります。Delta Lakeは、これらの小さなファイルを定期的に大きなファイルに統合(コンパクション)する機能を持っています。このコンパクションはトランザクションとして処理されるため、クエリを行うバッチ処理に対しても影響を与えません。したがって、ストリーミング処理で新しいデータを低レイテンシーで書き込みつつ、バッチ処理で効率的にデータを読み取ることが可能です。これにより、データフローの一貫性と迅速な処理が実現します。

タイムトラベル機能

 Delta Lakeのタイムトラベル機能は、過去のデータ状態を再現し、デバッグ、データ監査、モデルの再トレーニングなどに有効です。これにより、過去のデータを用いた分析やトラブルシューティングが容易になります。詳しくは、ACIDトランザクション実装の説明部分で補足します。

Delta Lakeのアーキテクチャ

データ構造の最適化

 Delta Lakeは効率的なデータ保存と高速なクエリ処理を目指し、以下のようにデータ構造を最適化しています。

  • Parquetファイル形式の採用: 列指向ストレージ形式であるParquetは、データ圧縮と高速な読み取り性能に優れ、Delta Lakeの効率的なデータアクセスを支えています。

  • Delta Logの活用: Delta Lakeはトランザクションログを利用してすべてのデータ変更を記録し、メタデータ管理や高速なクエリを実現します。

引用: https://www.vldb.org/pvldb/vol13/p3411-armbrust.pdf
  • データスキッピング技術: ファイルレベルの統計情報を基に、不要なデータをスキップし、高速なクエリ実行をサポートします。

Delta LakeのACIDトランザクション実装

トランザクションログ

 Delta Lakeの中心的な要素は、各トランザクションのすべての操作を記録するトランザクションログです。トランザクションログは、タイムスタンプ付きのJSON形式のファイルで構成されており、各ファイルにはそのトランザクションで行われたデータ追加、削除、メタデータの変更などが記録されています。これにより、データのバージョン管理や、トランザクションの履歴の追跡が可能となります。

楽観的並行制御(Optimistic Concurrency Control)
 Delta Lakeは、クラウドオブジェクトストアの特性に合わせて、楽観的並行制御を採用しています。簡単に言うと、コミットするまでロックを獲得せずに並行実行する方式です。これにより、複数のクライアントが同じテーブルに対して同時に書き込みを試みる場合でも、データの整合性が保たれるようにします。各トランザクションが新しいデータを追加するときは、トランザクションログにその変更内容が追加されます。このとき、他のトランザクションが同時に同じログファイルを書き換えることを防ぐため、ログファイルは一意の識別子(通常は連番)で管理され、トランザクションの順序も保証されます。もし複数のトランザクションが同じ識別子を使おうとした場合、Delta Lakeはそのうち一つだけを成功させ、他のトランザクションは再試行されます。これにより、競合が発生した場合でもデータの一貫性が確保されます。

チェックポイントとスナップショット

 トランザクションログは増え続けるため、定期的にチェックポイントが作成されます。チェックポイントは、トランザクションログの内容をまとめ、テーブルの状態を効率的に復元できるようにします。これにより、過去の特定の時点のデータ(スナップショット)にアクセスする「タイムトラベル」が可能になります。


以上です。Delta Lakeの肝であるトランザクションログ周りに説明し、従来のデータレイクでは実現できないACIDトランザクションがどのように実現されているのかを説明しました。参考になれば幸いです。


参考

https://docs.delta.io/latest/index.html
https://dl.acm.org/doi/10.14778/3415478.3415560

いいなと思ったら応援しよう!