Delta Lake、Presto、Dataproc Metastore でオープン クラウド データレイクを構築する方法
Google Cloud Japan Team
※この投稿は米国時間 2021 年 7 月 10 日に、Google Cloud blog に投稿されたものの抄訳です。
今日の組織は、オンプレミスとクラウドの両方にあるさまざまなソースから発信される大量のデータを処理、管理、保存するために、データレイクを構築しています。データレイク戦略の一環として、組織は優れた OSS フレームワークを活用したいと考えています。たとえば、場所を問わず実行できる柔軟性を提供し、ロックインを回避できるようにする、データ処理用の Apache Spark、クエリエンジンとしての Presto、Delta Lake などのデータ保存用のオープン形式があります。
従来、そのようなアーキテクチャを構築しデプロイする際の主な課題として、以下のものがありました。
オブジェクト ストレージが、変化するデータを扱うのに適しておらず、エンジニアリング チームが回避策を構築するために多くの時間を費やしていた
Google Cloud が Spark、Presto、その他のさまざまなクラスタを Dataproc サービスで実行するメリットを提供したが、そのようなデプロイに伴う課題の一つが、複数のクラスタ全体でメタデータを共有できるようにする中央 Hive メタストア サービスがないことだった
異なるオープンソース プロジェクト全体での統合と相互運用性の不足
これらの問題を解決するために、Google Cloud とオープンソース コミュニティは次のものを提供しています。
Dataproc 内のネイティブ Delta Lake サポート、Google Cloud Storage でデータレイクを構築するためのマネージド OSS Big Data スタック、変化に対応できるオブジェクト ストレージ。
Dataproc Metastore と呼ばれるマネージド Hive メタストア サービス。Dataproc とネイティブに統合され、共通のメタデータ管理とさまざまなタイプの Dataproc クラスタ全体を通じた検索を提供します。
Spark 3.0 と Delta 0.7.0 は Delta テーブルを Hive メタストアで登録できるようにし、異なるクラスタがアクセスできる共通のメタストア リポジトリを可能にします。
アーキテクチャ
GCP 上での標準的な Open Cloud Datalake デプロイの構成要素として考えられるものは、以下のとおりです。
Dataproc 上でネイティブ Delta Lake サポートによって実行される Apache Spark
データを Delta 形式で保存する中央データレイク リポジトリとしての Google Cloud Storage
異なる Dataproc クラスタと統合できる中央カタログとして機能する Dataproc Metastore サービス
インタラクティブなクエリのための、Dataproc 上で実行される Presto
このような統合は、以下の複数のメリットを提供します。
マネージド Hive メタストア サービス
データ ガバナンスのための、Data Catalog との統合
共有メタデータを持つ複数のエフェメラル クラスタ
最初から統合されているオープン ファイル形式と標準
リファレンス実装
以下は、インフラストラクチャを設定し、サンプル アプリケーションを実行するリファレンス実装に関する手順ガイドです。
セットアップ
最初に行う必要があるのは、次の 4 つの設定です。
データを保存するための Google Cloud Storage バケット
Dataproc Metastore サービス
データを Delta 形式で保存する Spark Application を実行する Delta クラスタ
インタラクティブ クエリに利用される Presto クラスタ
Google Cloud Storage バケットの作成
以下のコマンドに一意の名前を入れて使用し、Google Cloud Storage バケットを作成します。
Dataproc Metastore サービスの作成
Dataproc Metastore サービスを「demo-service」という名前で、バージョン 3.1.2 で作成します。us-central1 などのリージョンを選択します。これとプロジェクト ID を環境変数として設定します。
Delta Lake を使った Dataproc クラスタの作成
前のステップで作成された、同じリージョンにある Dataproc Metastore サービスに接続された Dataproc クラスタを作成します。このクラスタはデータレイクにデータを入力するために使用されます。Delta Lake を使用するのに必要な jar は、デフォルトで Dataproc のイメージ バージョン 1.5 以降にあります。
Presto を使用した Dataproc クラスタの作成
Presto Optional Component を使用して、Dataproc クラスタを us-central1 リージョンに作成し、Dataproc Metastore サービスに接続します。
Spark アプリケーション
クラスタが作成されたら、SSHing で Spark Shell にログインし、Dataproc クラスタ「delta-cluster」のマスターノードにログインできます。マスターノードにログインしたら、次のステップは、Dataproc クラスタにすでに提供されている jar ファイルを使用して Spark Shell を起動することです。Spark Shell を起動するには、以下のコマンドを実行する必要があります。そしてその後にデータを生成します。
# 初期 Delta 形式を GCS に書き込む
プロジェクト ID を置き換えて以下のコマンドを使用し、データを GCS に書き込みます。
# Spark からのデータの読み取りが正しく行われていることを確認する
プロジェクト ID を置き換えて以下のコマンドを使用し、データが GCS に書き込まれていることを確認します。
データが書き込まれたら、マニフェスト ファイルを生成し、テーブルが作成されたときにメタストア サービスを通じて Presto がデータを読み取れるようにする必要があります。
# マニフェスト ファイルを生成する
Spark 3.0 と Delta 0.7.0 を使用することで、Hive メタストアで Delta テーブルを作成できるようになりました。テーブルを作成するには、以下のコマンドを使用できます。詳細はこちらをご覧ください。
# Hive メタストア内にテーブルを作成する
Spark 内にテーブルが作成されたら、新しいウィンドウで Presto クラスタにログインし、データを確認します。Presto クラスタにログインし、Presto シェルを起動する手順については、こちらをご覧ください。
# Presto 内のデータを確認する
Presto を通じてデータを読み取れることを確認したら、次のステップはスキーマの進化を確認することです。この機能をテストするには、以下のとおり、追加列「z」を使って新しいデータフレームを作成します。
# Spark 内のスキーマの進化
Delta クラスタの Spark シェルに戻って、自動スキーマ進化フラグを有効にします。
フラグが有効になったら、新しい列とともに挿入される新しい行のセットのある、新しいデータフレームを作成します。
データフレームが作成されたら、Delta Merge 機能を使用して既存のデータを更新し、新しいデータを挿入します。
# Delta Merge Statement を使用して自動スキーマ進化を操作し、新しい行を追加する
次のステップとして、Presto に反映させるデータに対し 2 つのことを行う必要があります。
更新されたデータを Presto が認識できるように、更新したスキーマ マニフェスト ファイルを生成する
新しい列を Presto が認識できるようにテーブル スキーマを修正する
Delta テーブルのデータが更新されたら、以下のいずれかの方法でマニフェストを再生成する必要があります。
明示的に更新: すべてのデータの更新後、生成オペレーションを実行してマニフェストを更新できます。
自動的に更新: テーブルのすべての書き込みオペレーションが自動的にマニフェストを更新するように Delta テーブルを構成できます。この自動モードを有効にするために、以下の SQL コマンドを使用して、対応するテーブルを正しく設定できます。
ただし、この特定のケースでは、明示的な方法を使用してマニフェスト ファイルを再生成します。
マニフェスト ファイルが再作成されたら、次のステップでは Hive メタストア内のスキーマを更新して Presto が新しい列を認識するようにします。これを行う方法は複数ありますが、そのうちの 1 つを以下に示します。
# Delta を介して Presto にスキーマの変更をプロモートする
これらの変更が行われたら、Presto 内の新しいデータと新しい列を以下のように確認できます。
# Presto 内の変更を確認する
まとめると、この記事では以下のことを示しました。
Dataproc Metastore を使用して Hive メタストア サービスを設定し、Dataproc を使用して Delta レイクと Presto クラスタとともに Spark を起動する
Hive メタストア サービスを異なる Dataproc クラスタに統合する
さまざまな GCP サービスを利用した OSS Datalake プラットフォーム上で実行できるエンドツーエンドのアプリケーションを構築する
次のステップ
GCP 上で Open Data Platform を構築することにご興味がある場合は、Dataproc Metastore サービスをご覧ください(詳細はこちら、Dataproc サービスに関する詳細はこちらのドキュメントをご参照ください)。併せて、こちらのブログをご覧ください。Dataproc サービス内でネイティブにサポートされる Delta や Iceberg などのさまざまなオープン ストレージ形式について詳細を説明しています。
-プリンシパル アーキテクト Jayadeep Jayaraman