1. 简介
在此 Codelab 中,您将学习如何使用 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 尚未使用的字符串。您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用
PROJECT_ID
标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。 - 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。
在 Google Cloud 控制台 中,点击右上角工具栏中的 Cloud Shell 图标:
预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:
这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 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 允许在单个实例上使用多个数据库。
数据库是您定义架构的地方。您还可以控制谁有权访问数据库、设置自定义加密、配置优化工具以及设置保留期限。
如需创建数据库,请再次使用 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,并确保数据已包含。首先,展开主题表格以查看各列。
现在,运行以下查询以确保数据可用:
SELECT COUNT(*) FROM topics;
预期输出:
5. 从 BigQuery 读取数据
现在,您在 Spanner 中有了数据,是时候从 BigQuery 中访问这些数据了。为此,您需要在 BigQuery 中设置到 Spanner 的外部连接。
假设您拥有适当的权限,请按照以下步骤创建与 Spanner 的外部连接。
点击“添加”BigQuery 控制台顶部的“连接到永恒数据源”选项。
您现在可以运行查询以从 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;
输出示例:
您可以在“作业信息”中查看作业的相关信息,例如运行时长和处理的数据量标签页。
接下来,您将添加与 Spanner 的 Data Boost 连接,并比较结果。
6. 使用 Data Boost 读取数据
如需使用 Spanner Data Boost,您需要创建从 BigQuery 到 Spanner 的新外部连接。点击“Add”(添加)在 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,然后前往“系统数据分析”
在这里,您可以看到 CPU 指标。在没有 Data Boost 的情况下运行的查询会使用 CPU 作为“executesql_select_withPartitiontoken”操作。虽然查询是相同的,但 Data Boost 执行作业不会显示在实例 CPU 利用率上。
在许多情况下,使用 Data Boost 时,分析查询的性能会得到提升。本教程中的数据集很小,没有其他工作负载争用资源。因此,本教程不会展示性能提升。
您可以随意尝试查询和工作负载,并了解 Data Boost 的工作原理。完成后,请继续下一部分以清理环境。
8. 清理环境
如果您专门为此 Codelab 创建了项目,只需删除该项目即可将其清理干净。如果您想保留项目,并清理各个组件,请按以下步骤操作。
移除 BigQuery 连接
要移除这两个连接,请点击连接名称旁边的三个点。选择“删除”,然后按照说明删除此关联。
删除 Cloud Storage 存储分区
gcloud storage rm --recursive gs://$GCS_BUCKET
删除 Spanner 实例
如需清理,只需进入 Cloud 控制台的 Cloud Spanner 部分,然后删除“codelab-demo
”此 Codelab 中创建的应用示例。
9. 恭喜
恭喜您完成此 Codelab。
所学内容
- 如何部署 Spanner 实例
- 如何使用 Dataflow 将数据加载到 Spanner
- 如何通过 BigQuery 访问 Spanner 数据
- 如何使用 Spanner Data Boost 来避免对来自 BigQuery 的分析查询的 Spanner 实例产生影响
10. 调查问卷
输出如下: