Cloud SpannerのData Boostを触ってみた

2023.09.04

Google Cloudデータエンジニアのはんざわです。
今回の記事ではCloud SpannerのData Boostを実際に触ってみたいと思います。

先日開催されたGoogle Cloud NextでもData Boostが取り上げられており、デモも披露されていました。
セッションの内容が気になる方は以下のブログを確認してみてください。

Cloud Spanner Data Boostの概要

今まではBigQueryからCloud Spannerに連携クエリを実行すると稼働中の環境に悪影響を与える懸念がありました。
しかし、新しくGAになったData Boostを有効化することで既存の環境への影響をほぼゼロで連携クエリを実行することが可能になりました。

この機能はCloud Spannerが稼働しているコンピューティングリソースとは別に独立したコンピューティングリソースを追加することで稼働中の環境に影響を与えることなく連携クエリを実行することが可能になったようです。具体的には以下のような構造になっているそうです。

Data Boostを利用するケースとして以下のようなケースが挙げられます。

  1. 大量のデータを処理するためのBigQueryからSpannerへの連携クエリ
  2. SpannerのデータをCloud StorageにエクスポートするDataflowジョブ

また、料金はData Boostで実行される連携クエリで使用される処理ユニットに対してのみ発生するそうです。

実際に触ってみる

以下の公式ドキュメントを参考にしました。

Spannerの準備

Spannerの準備には以下のブログを参考に進めました。

最終的に以下のようになりました。

始める前に

以下2点の設定をしましょう。

  1. BigQuery ConnectionのAPIを有効化する
  2. spanner.databases.useDataBoostのIAM権限をユーザーアカウントやSAに付与する

APIを有効化せずに連携クエリを実行したら以下のようなエラーを吐きました。気をつけましょう。(実体験)

Invalid table-valued function EXTERNAL_QUERY Error accessing Cloud Spanner. connections to all backends failing; last error: UNKNOWN: ipv6:%5B2002:a05:6878:723::%5D:25735: Handshake failed at [4:3]

Spanner用のBigQuery Connectionを作成

以下のコマンドでコネクションを作成しました。問題無ければsuccessfully createdと表示されます。

bq mk --connection \
  --connection_type='CLOUD_SPANNER' \
  --properties='{"database":"projects/hanzawa-yuya/instances/data-boost-test/databases/example-db", "useParallelism":true, "useDataBoost": true}' \
  --location='asia-northeast1' \
  data_boost_connection

Spannerのデータにアクセスする

BigQuery側で以下のようなクエリを実行し、Spannerのデータにアクセスすることができました。

SELECT 
  *
FROM 
  EXTERNAL_QUERY("hanzawa-yuya.asia-northeast1.data_boost_connection", "SELECT * FROM Singers;")

注意点としてEXTERNAL_QUERY内で実行されるクエリはクエリ実行プランの最初の演算子が分散ユニオンである必要があります。

試しに分散ユニオンでないクエリを実行してみます。

SELECT 
  *
FROM 
  EXTERNAL_QUERY("hanzawa-yuya.asia-northeast1.data_boost_connection", "SELECT COUNT(*) FROM Singers;")

すると次のようなエラーを吐きます。

Error while reading data, error message: Error accessing Cloud Spanner. Query is not root partitionable since it does not have a DistributedUnion at the root. Please run EXPLAIN for query plan details. File: SELECT COUNT(*) FROM Singers;

まとめ

今回はData Boostを触ってみました。

検証で扱ったデータは量が少ないため、Data Boostの恩恵はあまり実感できませんでしたが、冒頭で紹介したGoogle Cloud Nextのセッションでは1TiBサイズのSpannerテーブルを扱ったデモを紹介していました。
そのデモではData Boostを無効にしている場合と有効にしている場合のCPU使用率と実行時間を比較しており、無効にしている場合はCPU使用率が約40%で処理に11分以上かかっていましたが、有効にしている場合はCPU使用率が約0.6%ほどで約1分で処理が終了していました。

今後、Spannerにアクセスする際には是非有効活用してみようと思います。