開始使用 Spanner Data Boost 和 BigQuery

1. 簡介

在本程式碼研究室中,您將瞭解如何使用 Spanner Data Boost,利用零 ETL 聯合查詢,從 BigQuery 查詢 Spanner 資料,且不影響 Spanner 資料庫。

f1de68f762a86cc7.png

Spanner Data Boost 是全代管的無伺服器服務,可為支援的 Spanner 工作負載提供獨立運算資源。有了 Data Boost,您就能使用無伺服器的隨選使用模型,在已佈建的 Spanner 執行個體中,執行數據分析查詢和資料匯出作業,幾乎不會影響現有工作負載。

與 BigQuery 外部連線配對時,Data Boost 可讓您輕鬆將 Spanner 中的資料查詢至數據分析平台,而不必移動複雜的 ETL 資料。

必要條件

  • 對 Google Cloud 控制台的基本概念
  • 指令列介面和 Google Shell 的基本技能

課程內容

  • 如何部署 Spanner 執行個體
  • 如何載入資料來建立 Spanner 資料庫
  • 如何在不使用 Data Boost 的情況下,透過 BigQuery 存取 Spanner 資料
  • 如何透過 Data Boost 從 BigQuery 存取 Spanner 資料

軟硬體需求

  • Google Cloud 帳戶和 Google Cloud 專案
  • 使用 Chrome 等網路瀏覽器

2. 設定和需求

自修環境設定

  1. 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您可以隨時更新付款方式。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為 PROJECT_ID)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。或者,您也可以自行嘗試,看看是否支援。在這個步驟後,這個名稱即無法變更,而且在專案期間內仍會保持有效。
  • 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件
  1. 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行本程式碼研究室不會產生任何費用 (如果有的話)。如要關閉資源,以免產生本教學課程結束後產生的費用,您可以刪除自己建立的資源或刪除專案。新使用者符合 $300 美元免費試用計畫的資格。

啟動 Cloud Shell

雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。

Google Cloud 控制台,按一下右上方的工具列上的 Cloud Shell 圖示:

55efc1aaa7a4d3ad.png

佈建並連線至環境的作業只需幾分鐘的時間。完成後,您應該會看到類似下方的內容:

7ffe5cbb04455448.png

這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 5 GB 主目錄,而且在 Google Cloud 中運作,大幅提高網路效能和驗證能力。本程式碼研究室的所有工作都可以在瀏覽器中完成。不必安裝任何程式。

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 執行個體

在這個步驟中,我們會為程式碼研究室設定 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 允許在單一執行個體上使用多個資料庫。

您可以在資料庫中定義結構定義。您也可以控管有權存取資料庫的使用者、設定自訂加密功能、設定最佳化器,以及設定保留期限。

如要建立資料庫,請再次使用 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、Cloud Storage 和 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 主控台] 頂端的按鈕,然後選取 [與即時資料來源的連線]如果有需要 SQL 指令的分析工作負載 則 BigQuery 可能是最佳選擇

580a0d237f11a9c5.png

75968de398fabf7e.png

您現在可以執行查詢,讀取 Spanner 中的資料。在 BigQuery 控制台中執行這項查詢,請務必將 ${PROJECT_ID} 的值替換成 ${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

接下來,請將 Data Boost 連線新增至 Spanner,然後比較結果。

6. 使用 Data Boost 讀取資料

如要使用 Spanner Data Boost,您必須從 BigQuery 建立新的外部連線。按一下「新增」並選取「Connections from external data sources」可以選取「重新建立」,再次生成新的提示

請在詳細資料中填入與 Spanner 相同的連線 URI。變更「連線 ID」然後勾選「使用數據用量強化功能」方塊。

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 數次,就會看到這項資訊。請記得取代 ${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」,然後前往「System Insights」頁面

c1dc67fcc7a2a71.png

您可以在這裡查看 CPU 指標在沒有 Data Boost 的情況下執行查詢,使用 CPU 處理「executesql_select_withpartitiontoken」作業。雖然查詢相同,但執行個體 CPU 使用率不會顯示 Data Boost 執行作業。

a86a7508b6738904.png

在許多情況下,使用 Data Boost 後,分析查詢的效能就會有所提升。本教學課程中的資料集很小,沒有其他工作負載相互競爭資源。因此,本教學課程不會預期可改善效能。

歡迎您嘗試各種查詢和工作負載,瞭解 Data Boost 的運作方式。完成後,請前往下一節清除環境。

8. 清除環境資源

如果您是專為本程式碼研究室建立的專案,只要刪除該專案即可清除。如要保留專案,並清除個別元件,請繼續按照下列步驟操作。

移除 BigQuery 連結

如要移除這兩個連結,請按一下連線名稱旁邊的三點圖示。選取「刪除」,然後按照操作說明刪除連結。

c9348832bcf202a9.png

刪除 Cloud Storage 值區

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

刪除 Spanner 執行個體

如要清除所用資源,請前往 Cloud 控制台的 Cloud Spanner 部分,然後刪除「codelab-demo」在程式碼研究室中建立的執行個體

ab7c83ebdab74c04.png

9. 恭喜

恭喜您完成本程式碼研究室。

涵蓋內容

  • 如何部署 Spanner 執行個體
  • 如何使用 Dataflow 將資料載入 Spanner
  • 如何透過 BigQuery 存取 Spanner 資料
  • 如何使用 Spanner Data Boost,避免影響 Spanner 執行個體,透過 BigQuery 進行分析查詢

10. 問卷調查

輸出:

您會如何使用這個教學課程?

只能閱讀 閱讀並完成練習