Spanner Data Boost と BigQuery を使ってみる

1. はじめに

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

f1de68f762a86cc7.png

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

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

前提条件

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

学習内容

  • 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 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 内のファイルを使用して Dataflow インポート ジョブを開始し、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 コンソールの上部にあるボタンをクリックし、[Connections to eternal data Sources] を選択します。選択します。

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 を使用して詳細を入力します。[接続 ID] を変更する[Data Boost(データブースト)]をのボックスを選択します。

8e2205255b56a279.png

Data Boost 接続が作成されたら、新しい接続名で同じクエリを実行できます。この場合も、クエリ内の project_id は実際の 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 コンソールの Spanner Studio に戻り、[システム分析情報] に移動します。

c1dc67fcc7a2a71.png

ここで CPU の指標を確認できます。Data Boost を使用せずに実行されたクエリは、「executesql_select_withpartitiontoken」必要があります。クエリが同じであっても、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 コンソールの Cloud Spanner セクションに移動して「codelab-demo」を削除します。この Codelab で作成したインスタンスです。

ab7c83ebdab74c04.png

9. 完了

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

学習した内容

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

10. アンケート

出力:

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

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