Dataflow のテンプレートを利用して、Spanner のテーブルデータを BigQuery で参照してみた

2020.10.26

こんにちは、みかみです。

トランザクション処理が必要なシステムでは、システムデータの管理に大規模分散型のリレーショナルデータベースである Cloud Spanner を使用しているケースも多いかと思いますが、Spanner のシステムデータを分析に利用する場合、BigQuery で SQL クエリを実行することが多いと思います。

Spanner のテーブルデータを Dataflow ジョブを使用して BigQuery にインポートする方法を確認してみました。

やりたいこと

  • Dataflow のテンプレートを使ってジョブを実行したい
  • Dataflow のジョブで Cloud Spanner のテーブルデータを GCS に出力したい
  • Cloud Spanner のテーブルデータを BigQuery にロードして参照したい

前提

動作確認には Cloud Shell を使用します。

また、Spanner や GCS、BigQuery、Dataflow の使用に必要な各種 Google Cloud API は有効化済みです。

Spanner のインスタンスとテーブルを作成

以下のクイックスタートを参照して、Cloud Spanner のインスタンス、データベース、テーブルを作成して、テスト用データを挿入します。

クイックスタートのサンプルの通り、3行のデータを example-dbSingers テーブルに INSERT しました。

Dataflow のジョブを作成して実行

Dataflow 管理コンソールから Cloud Spanner to Cloud Storage Text テンプレートでジョブを作成し、先ほど作成した Spanner のテーブルデータを GCS にエクスポートします。

今回は出力結果を確認しやすいように CSV ファイルでエクスポートしますが、Spanner のテーブルデータを AVRO ファイルで GCS に出力するためのテンプレートも準備されています。

Dataflow 管理コンソール上部の「テンプレートからジョブを作成」ボタンをクリックします。

ジョブ作成画面で任意のジョブ名を入力し、リージョンエンドポイントに asia-northeast1 を選択してテンプレートの選択プルダウンから「Cloud Spanner to Text Files on Cloud Storage」を選択します。 以下のパラメータを入力後、「ジョブを実行」ボタンをクリックすると、Dataflow ジョブの実行が開始します。

  • Cloud Spanner プロジェクトID
  • Cloud Spanner データベースID
  • Cloud Spanner インスタンスID
  • Cloud Spanner テーブル名
  • データ出力先の GCS パス
  • 一時ファイル出力用の GCS パス

実行後しばらく待ちます。 ジョブの処理内容と実行状況は管理コンソールのジョブグラフで視覚的に確認できます。

ジョブが正常終了したことを確認して、GCS の出力結果を確認してみます。

Spanner のテーブルデータの CSV ファイルと、テーブルスキーマの JSON ファイルが出力されたことが確認できました。

GCS のファイルデータを BigQuery にロード

GCS のテキストデータを BigQuery にロードするための Dataflow のテンプレートもありますが、既存テンプレートを利用する場合、BigQuery テーブルのスキーマ定義ファイルや、ロードデータのフォーマットを JSON に変換する UDF を準備する必要があります。

今回は手軽に実行できる bq load コマンドを使って、Dataflow で GCS に出力した Spanner のテーブルデータを BigQuery にロードします。

gcp_da_user@cloudshell:~ (cm-da-mikami-yuki-258308)$ bq load \
>     --autodetect \
>     --source_format=CSV \
>     dataflow_sql_dataset.test_spanner \
>     gs://test-mikami-dataflow/spanner/-00000-of-00001.csv
Waiting on bqjob_r615ba7616c09a36d_00000175641a30f5_1 ... (1s) Current status: DONE

ロード結果を確認してみます。

Spanner テーブルのデータが BigQuery にロードされたことが確認できました。

まとめ(所感)

Dataflow の Cloud Spanner to Cloud Storage Text テンプレートで、ノンコーディングで簡単に Spanner のテーブルデータを GCS にエクスポートできることが確認できました。

本エントリでは出力した Spanner のテーブルデータを BigQuery にロードしましたが、BigQuery では外部テーブルを定義して GCS 上のファイルデータに直接クエリを実行することもできます。

Dataflow ジョブのテンプレートは自分で作成することもできますが、Google 提供の各種テンプレートが準備されています。 既存テンプレートを使えば画面の UI 操作だけで簡単に Dataflow ジョブを実行してデータパイプラインを構築することができるので、Spanner に限らず他データベースサービスで管理しているデータを BigQuery で分析したい場合に利用すると非常に便利ではないかと思いました。

参考