Spanner Data Boost と BigQuery を使ってみる

1. はじめに

この Codelab では、Spanner Data Boost を使用して、Spanner データベースに影響を与えることなく、ゼロ ETL 連携クエリを使用して BigQuery から Spanner データをクエリする方法を学びます。

f1de68f762a86cc7.png

Spanner Data Boost は、サポートされている Spanner ワークロード用の独立したコンピューティング リソースを提供する、フルマネージドのサーバーレス サービスです。Data Boost を使用すると、サーバーレスのオンデマンド使用モデルを使用して、プロビジョニングされた Spanner インスタンス上の既存のワークロードへの影響がほぼゼロの状態で、分析クエリとデータ エクスポートを実行できます。

BigQuery 外部接続と組み合わせることで、Data Boost を使用して、複雑な ETL データ移動を行うことなく、Spanner からデータ分析プラットフォームにデータを簡単にクエリできます。

前提条件

  • Google Cloud コンソールの基本的な知識
  • コマンドライン インターフェースと Google Shell の基本的なスキル

学習内容

  • Spanner インスタンスをデプロイする方法
  • データを読み込んで Spanner データベースを作成する方法
  • Data Boost を使用せずに BigQuery から Spanner データにアクセスする方法
  • Data Boost を使用して BigQuery から Spanner データにアクセスする方法

必要なもの

  • Google Cloud アカウントと Google Cloud プロジェクト
  • ウェブブラウザ(Chrome など)

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Google Cloud Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。

55efc1aaa7a4d3ad.png

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

7ffe5cbb04455448.png

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。

3. Spanner のインスタンスとデータベースを作成する

Spanner API を有効にする

Cloud Shell で、プロジェクト ID が設定されていることを確認します。

gcloud config set project [YOUR-PROJECT-ID]
PROJECT_ID=$(gcloud config get-value project)

デフォルト リージョンを us-central1 に構成します。これは、Spanner のリージョン構成でサポートされている別のリージョンに変更できます。

gcloud config set compute/region us-central1

Spanner API を有効にします。

gcloud services enable spanner.googleapis.com

Spanner インスタンスを作成する

この手順では、Codelab 用に Spanner インスタンスを設定します。これを行うには、Cloud Shell を開いて次のコマンドを実行します。

export SPANNER_INSTANCE_ID=codelab-demo
export SPANNER_REGION=regional-us-central1
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=$SPANNER_REGION \
--description="Spanner Codelab instance" \
--nodes=1

コマンド出力:

$ gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=$SPANNER_REGION \
--description="Spanner Codelab instance" \
--nodes=1
Creating instance...done.  

データベースを作成する

インスタンスが実行されたら、データベースを作成できます。Spanner では、1 つのインスタンスに複数のデータベースを作成できます。

データベースは、スキーマを定義する場所です。データベースにアクセスできるユーザーの制御、カスタム暗号化の設定、オプティマイザーの構成、保持期間の設定も可能です。

データベースを作成するには、もう一度 gcloud コマンドライン ツールを使用します。

export SPANNER_DATABASE=codelab-db
gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID

コマンド出力:

$ gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID
Creating database...done.

4. データを読み込む

Data Boost を使用する前に、データベースにデータが必要です。これを行うには、Cloud Storage バケットを作成し、Avro インポートをバケットにアップロードして、Dataflow インポート ジョブを開始し、Avro データを Spanner に読み込みます。

API を有効にする

これを行うには、前のプロンプトが閉じている場合は、Cloud Shell プロンプトを開きます。

Compute Engine API、Cloud Storage API、Dataflow API を有効にしてください。

gcloud services enable compute.googleapis.com storage.googleapis.com dataflow.googleapis.com

想定されるコンソール出力:

$ gcloud services enable compute.googleapis.com storage.googleapis.com dataflow.googleapis.com
Operation "operations/acat.*snip*" finished successfully.

Cloud Storage にインポート ファイルをステージングする

次に、avro ファイルを保存するバケットを作成します。

export GCS_BUCKET=spanner-codelab-import_$(date '+%Y-%m-%d_%H_%M_%S')
gcloud storage buckets create gs://$GCS_BUCKET

想定されるコンソール出力:

$ gcloud storage buckets create gs://$GCS_BUCKET
Creating gs://spanner-codelab-import/...

次に、github から tar ファイルをダウンロードして展開します。

wget https://github.com/dtest/spanner-databoost-tutorial/releases/download/v0.1/spanner-chat-db.tar.gz
tar -xzvf spanner-chat-db.tar.gz 

想定されるコンソール出力:

$ wget https://github.com/dtest/spanner-databoost-tutorial/releases/download/v0.1/spanner-chat-db.tar.gz
*snip*
*snip*(123 MB/s) - spanner-chat-db.tar.gz' saved [46941709/46941709]
$
$ tar -xzvf spanner-chat-db.tar.gz 
spanner-chat-db/
spanner-chat-db/users.avro-00000-of-00002
spanner-chat-db/user_notifications-manifest.json
spanner-chat-db/interests-manifest.json
spanner-chat-db/users-manifest.json
spanner-chat-db/users.avro-00001-of-00002
spanner-chat-db/topics-manifest.json
spanner-chat-db/topics.avro-00000-of-00002
spanner-chat-db/topics.avro-00001-of-00002
spanner-chat-db/user_interests-manifest.json
spanner-chat-db/spanner-export.json
spanner-chat-db/interests.avro-00000-of-00001
spanner-chat-db/user_notifications.avro-00000-of-00001
spanner-chat-db/user_interests.avro-00000-of-00001

作成したバケットにファイルをアップロードします。

gcloud storage cp spanner-chat-db gs://$GCS_BUCKET --recursive

想定されるコンソール出力:

$ gcloud storage cp spanner-chat-db gs://$GCS_BUCKET --recursive
Copying file://spanner-chat-db/users.avro-00000-of-00002 to gs://spanner-codelab-import/spanner-chat-db/users.avro-00000-of-00002
Copying file://spanner-chat-db/user_notifications-manifest.json to gs://spanner-codelab-import/spanner-chat-db/user_notifications-manifest.json
Copying file://spanner-chat-db/interests-manifest.json to gs://spanner-codelab-import/spanner-chat-db/interests-manifest.json           
Copying file://spanner-chat-db/users-manifest.json to gs://spanner-codelab-import/spanner-chat-db/users-manifest.json
Copying file://spanner-chat-db/users.avro-00001-of-00002 to gs://spanner-codelab-import/spanner-chat-db/users.avro-00001-of-00002
Copying file://spanner-chat-db/topics-manifest.json to gs://spanner-codelab-import/spanner-chat-db/topics-manifest.json
Copying file://spanner-chat-db/topics.avro-00000-of-00002 to gs://spanner-codelab-import/spanner-chat-db/topics.avro-00000-of-00002
Copying file://spanner-chat-db/topics.avro-00001-of-00002 to gs://spanner-codelab-import/spanner-chat-db/topics.avro-00001-of-00002
Copying file://spanner-chat-db/user_interests-manifest.json to gs://spanner-codelab-import/spanner-chat-db/user_interests-manifest.json
Copying file://spanner-chat-db/spanner-export.json to gs://spanner-codelab-import/spanner-chat-db/spanner-export.json
Copying file://spanner-chat-db/interests.avro-00000-of-00001 to gs://spanner-codelab-import/spanner-chat-db/interests.avro-00000-of-00001
Copying file://spanner-chat-db/user_notifications.avro-00000-of-00001 to gs://spanner-codelab-import/spanner-chat-db/user_notifications.avro-00000-of-00001
Copying file://spanner-chat-db/user_interests.avro-00000-of-00001 to gs://spanner-codelab-import/spanner-chat-db/user_interests.avro-00000-of-00001
  Completed files 13/13 | 54.6MiB/54.6MiB                                                                                               

Average throughput: 46.4MiB/s

データをインポートする

Cloud Storage にファイルが保存されたら、データフロー インポート ジョブを開始して、データを Spanner に読み込むことができます。

gcloud dataflow jobs run import_chatdb \
    --gcs-location gs://dataflow-templates-us-central1/latest/GCS_Avro_to_Cloud_Spanner \
    --region us-central1 \
    --staging-location gs://$GCS_BUCKET/tmp \
    --parameters \
instanceId=$SPANNER_INSTANCE_ID,\
databaseId=$SPANNER_DATABASE,\
inputDir=gs://$GCS_BUCKET/spanner-chat-db

想定されるコンソール出力:

$ gcloud dataflow jobs run import_chatdb \
>     --gcs-location gs://dataflow-templates-us-central1/latest/GCS_Avro_to_Cloud_Spanner \
>     --region us-central1 \
>     --staging-location gs://$GCS_BUCKET/tmp \
>     --parameters \
> instanceId=$SPANNER_INSTANCE_ID,\
> databaseId=$SPANNER_DATABASE,\
> inputDir=gs://$GCS_BUCKET/spanner-chat-db
createTime: '*snip*'
currentStateTime: '*snip*'
id: *snip*
location: us-central1
name: import_chatdb
projectId: *snip*
startTime: '*snip*'
type: JOB_TYPE_BATCH

このコマンドを使用して、インポート ジョブのステータスを確認できます。

gcloud dataflow jobs list --filter="name=import_chatdb" --region us-central1

想定されるコンソール出力:

$ gcloud dataflow jobs list --filter="name=import_chatdb"
`--region` not set; getting jobs from all available regions. Some jobs may be missing in the event of an outage. https://cloud.google.com/dataflow/docs/concepts/regional-endpoints
JOB_ID                                   NAME           TYPE   CREATION_TIME        STATE    REGION
*snip*                                  import_chatdb  Batch  2024-04-*snip*  Done  us-central1

Spanner でデータを確認する

次に、Spanner Studio に移動して、データが存在することを確認します。まず、トピック テーブルを開いて列を表示します。

cd1cf38efd2b974a.png

次に、次のクエリを実行して、データが利用可能であることを確認します。

SELECT COUNT(*) FROM topics;

予想される出力:

89e5d92fbe71c022.png

5. BigQuery からデータを読み取る

Spanner にデータが格納されたので、BigQuery 内からデータにアクセスします。これを行うには、BigQuery で Spanner への外部接続を設定します。

適切な権限があることを前提として、次の手順で Spanner への外部接続を作成します。

BigQuery コンソールの上部にある [追加] ボタンをクリックし、[外部データソースへの接続] オプションを選択します。

580a0d237f11a9c5.png

75968de398fabf7e.png

これで、クエリを実行して Spanner からデータを読み取ることができます。BigQuery コンソールで次のクエリを実行します。必ず ${PROJECT_ID} の値を置き換えてください。

SELECT *
FROM (
  SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_no-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted") 
)
ORDER BY num_topics DESC;

出力例:

e47265487c3e39bd.png

[ジョブ情報] タブで、ジョブの実行時間や処理されたデータ量などの情報を確認できます。

9ae40b0aa8c4891.png

次に、Spanner に Data Boost 接続を追加し、結果を比較します。

6. Data Boost を使用してデータを読み取る

Spanner Data Boost を使用するには、BigQuery から Spanner への新しい外部接続を作成する必要があります。BigQuery コンソールで [追加] をクリックし、もう一度 [Connections from external data sources] を選択します。

Spanner への接続 URI と同じ詳細情報を入力します。[Connection ID] を変更し、[use data boost] チェックボックスをオンにします。

8e2205255b56a279.png

Data Boost 接続が作成されたら、同じクエリを新しい接続名で実行できます。ここでも、クエリ内の project_id を置き換えます。

SELECT *
FROM (
  SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_use-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted") 
)
ORDER BY num_topics DESC;

前と同じ結果セットが返されます。タイミングが変わりましたか?

7. Data Boost について

Spanner Data Boost を使用すると、Spanner インスタンスのリソースに関連しないリソースを使用できます。これにより、分析ワークロードが運用ワークロードに与える影響を軽減できます。

この状態は、Data Boost を使用しないクエリを 2 ~ 3 分間に数回実行すると確認できます。${PROJECT_ID} は置き換えてください。

SELECT *
FROM (
  SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_no-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted") 
)
ORDER BY num_topics DESC;

数分待ってから、クエリを実行して Data Boost を数回使用します。${PROJECT_ID} は置き換えてください。

SELECT *
FROM (
  SELECT * FROM EXTERNAL_QUERY("projects/${PROJECT_ID}/locations/us-central1/connections/codelab-demo-chat_use-databoost", "SELECT users.userUUID, SHA256(users.email) as hashed_email, COUNT(*) num_topics, m.last_posted from users HASH JOIN (select MAX(t.created) last_posted, t.userUUID FROM topics t GROUP BY 2) m USING (userUUID)HASH JOIN topics USING (userUUID) GROUP BY users.userUUID, users.email, m.last_posted") 
)
ORDER BY num_topics DESC;

Cloud Console の Spanner Studio に戻り、[システム分析情報] に移動します。

c1dc67fcc7a2a71.png

ここでは、CPU 指標を確認できます。Data Boost を使用せずに実行されるクエリは、executesql_select_withpartitiontoken オペレーションに CPU を使用しています。クエリは同じでも、Data Boost の実行はインスタンスの CPU 使用率に表示されません。

a86a7508b6738904.png

多くの場合、Data Boost を使用すると分析クエリのパフォーマンスが向上します。このチュートリアルのデータセットは小さく、リソースを競合する他のワークロードはありません。そのため、このチュートリアルではパフォーマンスの改善は期待できません。

クエリとワークロードを自由に試して、Data Boost の仕組みを確認してください。完了したら、次のセクションに進んで環境をクリーンアップします。

8. 環境をクリーンアップする

この Codelab 専用にプロジェクトを作成した場合は、プロジェクトを削除するだけでクリーンアップできます。プロジェクトを保持し、個々のコンポーネントをクリーンアップする場合は、次の手順に進みます。

BigQuery 接続を削除する

両方の接続を削除するには、接続名の横にあるその他アイコンをクリックします。[削除] を選択し、手順に沿って接続を削除します。

c9348832bcf202a9.png

Cloud Storage バケットを削除する

gcloud storage rm --recursive gs://$GCS_BUCKET

Spanner インスタンスを削除

クリーンアップするには、Cloud Console の Cloud Spanner セクションに移動して、Codelab で作成した「codelab-demo」インスタンスを削除します。

ab7c83ebdab74c04.png

9. 完了

以上で、この Codelab は完了です。

学習した内容

  • Spanner インスタンスをデプロイする方法
  • Dataflow を使用して Spanner にデータを読み込む方法
  • BigQuery から Spanner データにアクセスする方法
  • Spanner Data Boost を使用して、BigQuery からの分析クエリによる Spanner インスタンスへの影響を回避する方法

10. アンケート

出力:

このチュートリアルをどのように使用されますか?

全体を通して読むだけ 内容を読んで演習をやり遂げる