コンテンツに移動
デベロッパー

Delta Lake、Presto、Dataproc Metastore でオープン クラウド データレイクを構築する方法

2021年7月26日
Google Cloud Japan Team

※この投稿は米国時間 2021 年 7 月 10 日に、Google Cloud blog に投稿されたものの抄訳です。

今日の組織は、オンプレミスとクラウドの両方にあるさまざまなソースから発信される大量のデータを処理、管理、保存するために、データレイクを構築しています。データレイク戦略の一環として、組織は優れた OSS フレームワークを活用したいと考えています。たとえば、場所を問わず実行できる柔軟性を提供し、ロックインを回避できるようにする、データ処理用の Apache Spark、クエリエンジンとしての PrestoDelta 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 デプロイの構成要素として考えられるものは、以下のとおりです。

  1. Dataproc 上でネイティブ Delta Lake サポートによって実行される Apache Spark

  2. データを Delta 形式で保存する中央データレイク リポジトリとしての Google Cloud Storage

  3. 異なる Dataproc クラスタと統合できる中央カタログとして機能する Dataproc Metastore サービス

  4. インタラクティブなクエリのための、Dataproc 上で実行される Presto

https://storage.googleapis.com/gweb-cloudblog-publish/images/unnamed_28.max-600x600.max-600x600.png

このような統合は、以下の複数のメリットを提供します。

  1. マネージド Hive メタストア サービス

  2. データ ガバナンスのための、Data Catalog との統合

  3. 共有メタデータを持つ複数のエフェメラル クラスタ

  4. 最初から統合されているオープン ファイル形式と標準

リファレンス実装

以下は、インフラストラクチャを設定し、サンプル アプリケーションを実行するリファレンス実装に関する手順ガイドです。

セットアップ

最初に行う必要があるのは、次の 4 つの設定です。

  1. データを保存するための Google Cloud Storage バケット

  2. Dataproc Metastore サービス

  3. データを Delta 形式で保存する Spark Application を実行する Delta クラスタ

  4. インタラクティブ クエリに利用される 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 つのことを行う必要があります。

  1. 更新されたデータを Presto が認識できるように、更新したスキーマ マニフェスト ファイルを生成する

  2. 新しい列を Presto が認識できるようにテーブル スキーマを修正する

Delta テーブルのデータが更新されたら、以下のいずれかの方法でマニフェストを再生成する必要があります。

  • 明示的に更新: すべてのデータの更新後、生成オペレーションを実行してマニフェストを更新できます。

  • 自動的に更新: テーブルのすべての書き込みオペレーションが自動的にマニフェストを更新するように Delta テーブルを構成できます。この自動モードを有効にするために、以下の SQL コマンドを使用して、対応するテーブルを正しく設定できます。

読み込んでいます...

ただし、この特定のケースでは、明示的な方法を使用してマニフェスト ファイルを再生成します。

読み込んでいます...

マニフェスト ファイルが再作成されたら、次のステップでは Hive メタストア内のスキーマを更新して Presto が新しい列を認識するようにします。これを行う方法は複数ありますが、そのうちの 1 つを以下に示します。

# Delta を介して Presto にスキーマの変更をプロモートする

読み込んでいます...

これらの変更が行われたら、Presto 内の新しいデータと新しい列を以下のように確認できます。

# Presto 内の変更を確認する

読み込んでいます...

まとめると、この記事では以下のことを示しました。

  1. Dataproc Metastore を使用して Hive メタストア サービスを設定し、Dataproc を使用して Delta レイクと Presto クラスタとともに Spark を起動する

  2. Hive メタストア サービスを異なる Dataproc クラスタに統合する

  3. さまざまな GCP サービスを利用した OSS Datalake プラットフォーム上で実行できるエンドツーエンドのアプリケーションを構築する

次のステップ

GCP 上で Open Data Platform を構築することにご興味がある場合は、Dataproc Metastore サービスをご覧ください(詳細はこちら、Dataproc サービスに関する詳細はこちらのドキュメントをご参照ください)。併せて、こちらのブログをご覧ください。Dataproc サービス内でネイティブにサポートされる Delta や Iceberg などのさまざまなオープン ストレージ形式について詳細を説明しています。

-プリンシパル アーキテクト Jayadeep Jayaraman

投稿先