本文档介绍了如何创建 BigQuery 订阅。您可以使用 Google Cloud 控制台、Google Cloud CLI、客户端库或 Pub/Sub API 创建 BigQuery 订阅。
准备工作
在阅读本文档之前,请确保您熟悉以下内容:
订阅的运作方式。
BigQuery 订阅的工作流程。
如何配置死信主题来处理消息失败。
除了熟悉 Pub/Sub 和 BigQuery 之外,在创建 BigQuery 订阅之前,请确保您满足以下前提条件:
BigQuery 表已存在。或者,您也可以在创建 BigQuery 订阅时创建,如本文档后面的部分所述。
Pub/Sub 主题的架构与 BigQuery 表的架构之间的兼容性。如果您添加不兼容的 BigQuery 表,则会收到与兼容性相关的错误消息。如需了解详情,请参阅架构兼容性。
所需的角色和权限
如需获得创建 BigQuery 订阅所需的权限,请让您的管理员为您授予项目的 Pub/Sub Editor (roles/pubsub.editor) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
此预定义角色包含创建 BigQuery 订阅所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
创建 BigQuery 订阅需要以下权限:
-
针对项目的
pubsub.subscriptions.create权限 -
pubsub.topics.attachSubscription主题
跨项目订阅
如果您在一个项目中为另一个项目中的主题创建订阅,则必须对创建订阅的项目拥有 pubsub.subscriptions.create 权限,并且对相应主题拥有 pubsub.topics.attachSubscription 权限。
向服务账号授予 IAM 角色
Pub/Sub 使用 Identity and Access Management (IAM) 服务账号访问 Google Cloud 资源。默认情况下,它使用 Pub/Sub 服务代理 (service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com)。
如需使 Pub/Sub 能够写入 BigQuery 表,服务账号需要具有 BigQuery Data Editor (roles/bigquery.dataEditor) 角色。您可以为服务账号授予项目或表的权限,具体如下:
项目
在 Google Cloud 控制台中,前往 IAM 页面。
选择包括 Google 提供的角色授权。
找到 Cloud Pub/Sub 服务账号对应的行,然后点击 修改主账号。
点击添加其他角色,然后选择 BigQuery Data Editor 角色。
如需了解详情,请参阅使用控制台授予 IAM 角色。
表
在 Google Cloud 控制台中,前往 BigQuery Studio。
在标记为按名称和标签过滤的“探索器”窗格搜索框中,输入表的名称,然后按 Enter 键。
在搜索结果中,点击要授予权限的表的名称。
在详细信息标签页中,依次点击 共享 > 管理权限。
点击 添加主账号,然后输入服务账号标识符,格式如下:
service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com。在分配角色列表中,选择 BigQuery Data Editor。
点击保存。将向主账号授予资源上的角色。
使用自定义服务账号
通过向 Cloud Pub/Sub 服务账号授予 BigQuery Data Editor 角色,有权在您的项目中创建订阅的任何用户都可以写入 BigQuery 表。如果您想提供更精细的权限,请改为配置用户代管式服务账号。
如需配置用户代管式服务账号以向 BigQuery 写入数据,您需要具备以下权限:
用户代管式服务账号必须具有 BigQuery Data Editor 角色。
Cloud Pub/Sub 服务账号必须对用户代管式服务账号具有
iam.serviceAccounts.getAccessToken权限。创建订阅的用户必须拥有用户代管式服务账号的
iam.serviceAccounts.actAs权限。
创建订阅时,请将用户代管式服务账号指定为订阅服务账号。
BigQuery 订阅属性
BigQuery 订阅支持所有常见订阅属性。以下部分介绍了 BigQuery 订阅特有的属性。
使用主题架构
此选项可让 Pub/Sub 使用订阅所附加的 Pub/Sub 主题的架构。此外,Pub/Sub 会将消息中的字段写入 BigQuery 表中的相应列。
使用此选项时,请务必检查是否满足以下附加要求:
主题架构和 BigQuery 架构中的字段必须具有相同的名称,并且它们的类型必须彼此兼容。
主题架构中的任何可选字段在 BigQuery 架构中也必须是可选字段。
主题架构中的必填字段在 BigQuery 架构中不必是必填字段。
如果存在主题架构中没有的 BigQuery 字段,则这些 BigQuery 字段必须处于
NULLABLE模式。如果主题架构中包含 BigQuery 架构中没有的其他字段,并且可以舍弃这些字段,请选择舍弃未知字段选项。
您只能选择一个订阅属性:使用主题架构或使用表架构。
如果您未选择使用主题架构或使用表架构选项,请确保 BigQuery 表有一个名为 data 的列,其类型为 BYTES、STRING 或 JSON。Pub/Sub 会将消息写入此 BigQuery 列。
您可能不会立即看到对 Pub/Sub 主题架构或 BigQuery 表架构的更改对写入 BigQuery 表的消息生效。例如,如果启用了舍弃未知字段选项,并且某个字段存在于 Pub/Sub 架构中,但不存在于 BigQuery 架构中,那么即使将该字段添加到 BigQuery 架构中,写入 BigQuery 表的消息可能仍然不包含该字段。最终,架构会同步,后续消息会包含该字段。
为 BigQuery 订阅使用使用主题架构选项时,您还可以利用 BigQuery 变更数据捕获 (CDC)。CDC 通过处理更改并将更改应用于现有行来更新 BigQuery 表。
如需详细了解此功能,请参阅使用变更数据捕获来流式插入表更新。
如需了解如何将此功能与 BigQuery 订阅搭配使用,请参阅 BigQuery 变更数据捕获。
使用表架构
借助此选项,Pub/Sub 可以使用 BigQuery 表的架构将 JSON 消息的字段写入相应的列。使用此选项时,请务必检查是否满足以下额外要求:
BigQuery 表中每列的名称只能包含字母(a-z、A-Z)、数字 (0-9) 或下划线 (_)。
发布的消息必须采用 JSON 格式。
如果 BigQuery 表列具有
JSON数据类型,则 Pub/Sub 消息中的相应字段必须是转义字符串中的有效 JSON。例如,对于名为myData的列,消息字段必须为"myData": "{\"key\":\"value\"}"。BigQuery 会拒绝不包含有效 JSON 的消息。支持以下 JSON 转换:
JSON 类型 BigQuery 数据类型 stringNUMERIC、BIGNUMERIC、DATE、TIME、DATETIME或TIMESTAMPnumberNUMERIC、BIGNUMERIC、DATE、TIME、DATETIME或TIMESTAMP- 使用
numberDATE、DATETIME、TIME或TIMESTAMP转化数据时,数字必须遵循支持的表示法。 - 使用
number到NUMERIC或BIGNUMERIC的转换时,值的精度和范围会限制为 IEEE 754 浮点运算标准所接受的精度和范围。如果您需要高精度或更广的值范围,请改用string到NUMERIC或BIGNUMERIC转换。 - 在将
string转换为NUMERIC或BIGNUMERIC时,Pub/Sub 会假定该字符串是人类可读的数字(例如"123.124")。如果无法将该字符串作为人类可读的数字进行处理,Pub/Sub 会将该字符串视为使用 BigDecimalByteStringEncoder 编码的字节。
- 使用
如果订阅的主题具有关联的架构,则必须将消息编码属性设置为
JSON。如果消息中没有 BigQuery 字段,则这些 BigQuery 字段必须处于
NULLABLE模式。如果消息包含 BigQuery 架构中不存在的其他字段,并且可以舍弃这些字段,请选择舍弃未知字段选项。
您只能选择订阅属性使用主题架构或使用表架构中的一个。
如果您未选择使用主题架构或使用表架构选项,请确保 BigQuery 表有一个名为 data 的列,其类型为 BYTES、STRING 或 JSON。Pub/Sub 会将消息写入此 BigQuery 列。
您可能不会立即看到写入 BigQuery 表的消息对 BigQuery 表架构的更改生效。例如,如果启用了舍弃未知字段选项,并且消息中存在某个字段,但 BigQuery 架构中不存在该字段,那么即使将该字段添加到 BigQuery 架构中,写入 BigQuery 表的消息可能仍然不包含该字段。最终,架构会同步,后续消息会包含该字段。
如果您为 BigQuery 订阅选择使用表架构选项,还可以利用 BigQuery 变更数据捕获 (CDC) 功能。CDC 通过处理对现有行的更改并将其应用于现有行来更新 BigQuery 表。
如需详细了解此功能,请参阅使用变更数据捕获来流式插入表更新。
如需了解如何将此功能与 BigQuery 订阅搭配使用,请参阅 BigQuery 变更数据捕获。
删除未知字段
此选项与使用主题架构或使用表架构选项搭配使用。启用此选项后,Pub/Sub 可以舍弃主题架构或消息中存在但 BigQuery 架构中不存在的任何字段。将消息写入 BigQuery 表时,不属于 BigQuery 架构的字段会被舍弃。
如果不设置丢弃未知字段,则包含额外字段的消息不会写入 BigQuery,并且会保留在订阅积压消息中,除非您配置死信主题。
丢弃未知字段设置不会影响未在 Pub/Sub 主题架构或 BigQuery 表架构中定义的字段。在这种情况下,有效的 Pub/Sub 消息会传递到订阅。不过,由于 BigQuery 没有为这些额外字段定义列,因此在 BigQuery 写入过程中,这些字段会被舍弃。为防止出现此行为,请确保 Pub/Sub 消息中包含的所有字段也包含在 BigQuery 表架构中。
有关额外字段的行为也可能取决于所用的特定架构类型(Avro、协议缓冲区)和编码(JSON、二进制)。如需了解这些因素如何影响额外字段的处理,请参阅特定架构类型和编码的文档。
写入元数据
此选项可让 Pub/Sub 将每条消息的元数据写入 BigQuery 表中的其他列。否则,元数据不会写入 BigQuery 表。
如果您选择写入元数据选项,请确保 BigQuery 表具有下表中描述的字段。
如果您未选择写入元数据选项,则目标 BigQuery 表只需要 data 字段,除非 use_topic_schema 为 true。如果您同时选择写入元数据和使用主题架构选项,则主题的架构不得包含任何名称与元数据参数名称相同的字段。此限制包括这些蛇形命名参数的驼峰式命名版本。
| 参数 | |
|---|---|
subscription_name |
STRING 订阅的名称。 |
message_id |
STRING 消息的 ID |
publish_time |
时间戳 发布消息的时间。 |
data |
BYTES、STRING 或 JSON 邮件正文。 对于未选择使用主题架构或使用表架构的所有目标 BigQuery 表, |
attributes |
STRING 或 JSON 包含所有消息属性的 JSON 对象。它还包含 Pub/Sub 消息的其他字段,包括排序键(如果存在)。 |
服务账号
您可以通过以下方式将消息写入 BigQuery 表:
配置自定义服务账号,以便只有对该服务账号拥有
iam.serviceAccounts.actAs权限的用户才能创建向该表写入数据的订阅。包含iam.serviceAccounts.actAs权限的角色示例是服务账号用户 (roles/iam.serviceAccountUser) 角色。使用默认的 Pub/Sub 服务代理,该代理允许项目中任何有权创建订阅的用户创建可向表写入数据的订阅。如果您未指定自定义服务账号,则 Pub/Sub 服务代理是默认设置。
创建 BigQuery 订阅
如需创建具有 BigQuery 传送功能的订阅,请执行以下步骤。
控制台
gcloud
-
在 Google Cloud 控制台中,激活 Cloud Shell。
Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。
如需创建 Pub/Sub 订阅,请使用
gcloud pubsub subscriptions create命令:gcloud pubsub subscriptions create SUBSCRIPTION_ID \ --topic=TOPIC_ID \ --bigquery-table=PROJECT_ID.DATASET_ID.TABLE_ID如果您想使用自定义服务账号,请将其作为附加参数提供:
gcloud pubsub subscriptions create SUBSCRIPTION_ID \ --topic=TOPIC_ID \ --bigquery-table=PROJECT_ID.DATASET_ID.TABLE_ID \ --bigquery-service-account-email=SERVICE_ACCOUNT_NAME替换以下内容:
SUBSCRIPTION_ID:指定订阅的 ID。TOPIC_ID:指定主题的 ID。主题需要架构。PROJECT_ID:指定项目的 ID。DATASET_ID:指定现有数据集的 ID。如需创建数据集,请参阅 创建数据集。TABLE_ID:指定现有表的 ID。如果主题没有架构,则表需要包含data字段。如需创建表,请参阅创建具有架构定义的空表。SERVICE_ACCOUNT_NAME:指定用于写入 BigQuery 的服务账号的名称。
C++
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C++ 设置说明进行操作。如需了解详情,请参阅 Pub/Sub C++ API 参考文档。
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
Go
以下示例使用 Go Pub/Sub 客户端库的主要版本 (v2)。如果您仍在使用 v1 库,请参阅迁移指南。如需查看 v1 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照快速入门:使用客户端库中的 Go 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
Node.ts
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
以下示例使用 Ruby Pub/Sub 客户端库 v3。如果您仍在使用 v2 库,请参阅 迁移指南。如需查看 Ruby v2 代码示例的列表,请参阅 已弃用的代码示例。
试用此示例之前,请按照快速入门:使用客户端库中的 Ruby 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
监控 BigQuery 订阅
Cloud Monitoring 提供了许多指标来监控订阅。
如需查看与 Pub/Sub 相关的所有可用指标及其说明的列表,请参阅 Pub/Sub 的 Monitoring 文档。
您还可以在 Pub/Sub 中监控订阅。
后续步骤
- 使用
gcloud命令创建或修改订阅。 - 使用 REST API 创建或修改订阅。
- 排查 BigQuery 订阅问题。