1. 簡介
在本程式碼研究室中,您將瞭解如何使用 Spanner Data Boost,利用零 ETL 聯合查詢,從 BigQuery 查詢 Spanner 資料,且不影響 Spanner 資料庫。
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. 設定和需求
自修環境設定
- 登入 Google Cloud 控制台,建立新專案或重複使用現有專案。如果您還沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶。
- 「專案名稱」是這項專案參與者的顯示名稱。這是 Google API 未使用的字元字串。您可以隨時更新付款方式。
- 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。Cloud 控制台會自動產生一個不重複的字串。但通常是在乎它何在在大部分的程式碼研究室中,您必須參照專案 ID (通常為
PROJECT_ID
)。如果您對產生的 ID 不滿意,可以隨機產生一個 ID。或者,您也可以自行嘗試,看看是否支援。在這個步驟後,這個名稱即無法變更,而且在專案期間內仍會保持有效。 - 資訊中的第三個值是專案編號,部分 API 會使用這個編號。如要進一步瞭解這三個值,請參閱說明文件。
- 接下來,您需要在 Cloud 控制台中啟用計費功能,才能使用 Cloud 資源/API。執行本程式碼研究室不會產生任何費用 (如果有的話)。如要關閉資源,以免產生本教學課程結束後產生的費用,您可以刪除自己建立的資源或刪除專案。新使用者符合 $300 美元免費試用計畫的資格。
啟動 Cloud Shell
雖然 Google Cloud 可以從筆記型電腦遠端操作,但在本程式碼研究室中,您將使用 Google Cloud Shell,這是一種在 Cloud 中執行的指令列環境。
在 Google Cloud 控制台,按一下右上方的工具列上的 Cloud Shell 圖示:
佈建並連線至環境的作業只需幾分鐘的時間。完成後,您應該會看到類似下方的內容:
這部虛擬機器都裝載了您需要的所有開發工具。提供永久的 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,確認有資料。首先,展開主題表格以查看資料欄。
現在,請執行下列查詢,確保能取得資料:
SELECT COUNT(*) FROM topics;
預期輸出內容:
5. 從 BigQuery 讀取資料
您已在 Spanner 中存有資料,現在可以從 BigQuery 存取資料了。為此,您需要在 BigQuery 中設定Spanner 的外部連線。
假設您具備正確的權限,請執行下列步驟,建立連至 Spanner 的外部連線。
按一下「新增」[BigQuery 主控台] 頂端的按鈕,然後選取 [與即時資料來源的連線]如果有需要 SQL 指令的分析工作負載 則 BigQuery 可能是最佳選擇
您現在可以執行查詢,讀取 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;
輸出內容範例:
您可以在「工作資訊」中查看工作相關資訊,例如執行工作所需時間和處理的資料量分頁。
接下來,請將 Data Boost 連線新增至 Spanner,然後比較結果。
6. 使用 Data Boost 讀取資料
如要使用 Spanner Data Boost,您必須從 BigQuery 建立新的外部連線。按一下「新增」並選取「Connections from external data sources
」可以選取「重新建立」,再次生成新的提示
請在詳細資料中填入與 Spanner 相同的連線 URI。變更「連線 ID」然後勾選「使用數據用量強化功能」方塊。
建立 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」頁面
您可以在這裡查看 CPU 指標在沒有 Data Boost 的情況下執行查詢,使用 CPU 處理「executesql_select_withpartitiontoken」作業。雖然查詢相同,但執行個體 CPU 使用率不會顯示 Data Boost 執行作業。
在許多情況下,使用 Data Boost 後,分析查詢的效能就會有所提升。本教學課程中的資料集很小,沒有其他工作負載相互競爭資源。因此,本教學課程不會預期可改善效能。
歡迎您嘗試各種查詢和工作負載,瞭解 Data Boost 的運作方式。完成後,請前往下一節清除環境。
8. 清除環境資源
如果您是專為本程式碼研究室建立的專案,只要刪除該專案即可清除。如要保留專案,並清除個別元件,請繼續按照下列步驟操作。
移除 BigQuery 連結
如要移除這兩個連結,請按一下連線名稱旁邊的三點圖示。選取「刪除」,然後按照操作說明刪除連結。
刪除 Cloud Storage 值區
gcloud storage rm --recursive gs://$GCS_BUCKET
刪除 Spanner 執行個體
如要清除所用資源,請前往 Cloud 控制台的 Cloud Spanner 部分,然後刪除「codelab-demo
」在程式碼研究室中建立的執行個體
9. 恭喜
恭喜您完成本程式碼研究室。
涵蓋內容
- 如何部署 Spanner 執行個體
- 如何使用 Dataflow 將資料載入 Spanner
- 如何透過 BigQuery 存取 Spanner 資料
- 如何使用 Spanner Data Boost,避免影響 Spanner 執行個體,透過 BigQuery 進行分析查詢
10. 問卷調查
輸出: