本文档介绍了如何创建 BigQuery 订阅。您可以使用 Trusted Cloud 控制台、Google Cloud CLI、客户端库或 Pub/Sub API 创建 BigQuery 订阅。
准备工作
在阅读本文档之前,请确保您熟悉以下内容:
订阅的运作方式。
BigQuery 订阅的工作流程。
如何配置死信主题来处理消息故障。
除了熟悉 Pub/Sub 和 BigQuery 之外,在创建 BigQuery 订阅之前,请确保您满足以下前提条件:
BigQuery 表存在。或者,您也可以在创建 BigQuery 订阅时创建,如本文档后面的部分所述。
Pub/Sub 主题的架构与 BigQuery 表的架构之间的兼容性。如果您添加不兼容的 BigQuery 表,系统会显示一条与兼容性相关的错误消息。如需了解详情,请参阅架构兼容性。
所需的角色和权限
以下是有关角色和权限的准则:
如需创建订阅,您必须在项目级层配置访问权限控制。
如果您的订阅和主题位于不同的项目中,您还需要资源级权限,如本部分稍后所述。
如需创建 BigQuery 订阅,Pub/Sub 服务代理或自定义服务账号必须具有向特定 BigQuery 表写入数据的权限。如需详细了解如何授予这些权限,请参阅本文档的下一部分。
您可以在一个项目中配置 BigQuery 订阅,以写入另一个项目中的 BigQuery 表。
如需获得创建 BigQuery 订阅所需的权限,请让管理员为您授予项目的 Pub/Sub Editor (roles/pubsub.editor
) IAM 角色。
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
此预定义角色包含创建 BigQuery 订阅所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
如需创建 BigQuery 订阅,您需要具备以下权限:
-
从订阅中拉取:
pubsub.subscriptions.consume
-
创建订阅:
pubsub.subscriptions.create
-
删除订阅:
pubsub.subscriptions.delete
-
获取订阅:
pubsub.subscriptions.get
-
列出订阅:
pubsub.subscriptions.list
-
更新订阅:
pubsub.subscriptions.update
-
将订阅附加到主题:
pubsub.topics.attachSubscription
-
获取订阅的 IAM 政策:
pubsub.subscriptions.getIamPolicy
-
为订阅配置 IAM 政策:
pubsub.subscriptions.setIamPolicy
如需允许一个项目中的正文在另一个项目中创建 BigQuery 订阅,您必须在两个项目中都向该正文授予 Pub/Sub Editor (roles/pubsub.editor
) 角色。此角色提供创建新 BigQuery 订阅并将其附加到原始主题所需的权限。主题的 Pub/Sub Editor (roles/pubsub.editor
) 角色还可以帮助您将其他项目中的 BigQuery 订阅附加到该主题。
为服务账号分配角色
某些 Trusted Cloud by S3NS 服务具有 Trusted Cloud管理的服务账号,可让服务访问您的资源。这些服务账号称为服务代理。Pub/Sub 会为每个项目创建并维护一个服务代理,格式为 service-project-number@gcp-sa-pubsub.s3ns-system.iam.gserviceaccount.com
。
您可以选择让 Pub/Sub 服务代理或自定义服务账号拥有向 BigQuery 表写入数据的权限。
向 Pub/Sub 服务代理授予权限意味着,有权在您的项目中创建订阅的任何用户都可以写入 BigQuery 表。如果您想为写入 BigQuery 表提供更精细的权限,请改为配置自定义服务账号。
如需详细了解 BigQuery IAM,请参阅 BigQuery 角色和权限。
为 Pub/Sub 服务代理分配 BigQuery 角色
如果您想使用 Pub/Sub 服务代理创建 BigQuery 订阅,则该代理必须有权写入特定的 BigQuery 表并读取表元数据。
向 Pub/Sub 服务代理授予 BigQuery Data Editor (roles/bigquery.dataEditor
) 角色。您可以针对单个表或整个项目授予相应权限。
表
在 Trusted Cloud 控制台中,前往 BigQuery Studio。
在标有按名称和标签过滤的“探索器”窗格搜索框中,输入表的名称,然后按 Enter 键。
点击要授予权限的表。
对于相应表格,依次选择
更多操作 > 共享 > 权限。或者,点击表格,然后在主页面中依次点击共享 > 权限。
系统会打开共享权限窗口。
点击添加主账号。
在添加主账号部分,输入包含订阅的项目所对应的 Pub/Sub 服务代理的名称。服务代理的格式为
service-project-number@gcp-sa-pubsub.s3ns.iam.gserviceaccount.com
。例如,对于项目project-number=112233445566
,服务代理的格式为service-112233445566@gcp-sa-pubsub.s3ns.iam.gserviceaccount.com
。在选择角色下拉菜单中,输入
BigQuery
,然后选择 BigQuery Data Editor 角色。点击保存。
项目
在 Trusted Cloud 控制台中,前往 IAM 页面。
点击授予访问权限。
在添加主账号部分,输入 Pub/Sub 服务代理的名称。服务代理的格式为
service-project-number@gcp-sa-pubsub.s3ns.iam.gserviceaccount.com
。例如,对于项目project-number=112233445566
,服务代理的格式为service-112233445566@gcp-sa-pubsub.s3ns.iam.gserviceaccount.com
。在分配角色部分中,点击添加其他角色。
在选择角色下拉菜单中,输入
BigQuery
,然后选择 BigQuery Data Editor 角色。点击保存。
向自定义服务账号分配 BigQuery 角色
如果您想使用自定义服务账号写入 BigQuery 表,则必须设置以下权限:
- 自定义服务账号必须有权写入特定的 BigQuery 表并读取该表的元数据。
- Pub/Sub 服务代理必须对自定义服务账号具有
iam.serviceAccounts.getAccessToken
权限。 - 创建订阅的用户必须对自定义服务账号拥有
iam.serviceAccounts.actAs
权限。
按照以下步骤创建服务账号并授予权限:
创建自定义服务账号。服务账号必须与订阅位于同一项目中。
向自定义服务账号授予 BigQuery Data Editor (
roles/bigquery.dataEditor
) 角色。您可以向服务账号授予对项目中的单个表或所有表的权限。如需执行此操作,请参阅向 Pub/Sub 服务代理分配 BigQuery 角色中的相应部分。在该过程中,将 Pub/Sub 服务代理电子邮件地址替换为自定义服务账号电子邮件地址。
向 Pub/Sub 服务代理授予对自定义服务账号或项目中所有服务账号的
iam.serviceAccounts.getAccessToken
权限。您可以通过向 Pub/Sub 服务代理授予roles/iam.serviceAccountTokenCreator
角色来授予此权限。根据您的需求选择合适的方法。
服务账号
在 Trusted Cloud 控制台中,打开服务账号页面。
在过滤条件中输入自定义服务账号的名称。
从列表中选择服务账号。
点击具有访问权限的主账号。
点击授予访问权限。
在添加主账号部分,输入包含订阅的项目对应的 Pub/Sub 服务代理的名称。服务代理的格式为
service-project-number@gcp-sa-pubsub.s3ns.iam.gserviceaccount.com
。例如,对于项目project-number=112233445566
,服务代理的格式为service-112233445566@gcp-sa-pubsub.s3ns.iam.gserviceaccount.com
。在请选择一个角色下拉菜单中,输入
Service Account
,然后选择 Service Account Token Creator 角色。点击保存。
项目
在 Trusted Cloud 控制台中,前往 IAM 页面。
点击授予访问权限。
在添加主账号部分,输入自定义服务账号的名称。
在分配角色部分中,点击添加其他角色。
在请选择一个角色下拉菜单中,输入
Service Account
,然后选择 Service Account Token Creator 角色。点击保存。
如果您创建了自定义服务账号,则应该已经拥有必要的 iam.serviceAccounts.actAs
权限。如果您需要向其他人授予服务账号的权限,请执行以下操作:
在 Trusted Cloud 控制台中,打开服务账号页面。
在过滤条件中输入自定义服务账号的名称。
从列表中选择服务账号。
点击具有访问权限的主账号。
点击授予访问权限。
在添加主账号部分,输入要授予访问权限的账号的名称。
在选择角色下拉菜单中,输入
Service Account
,然后选择服务账号用户角色。此外,如果您的 BigQuery 表是 Apache Iceberg 表,请向 Pub/Sub 服务账号授予 Storage Admin 角色 (
roles/storage.admin
),以便其访问 Cloud Storage 存储桶。点击保存。
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 数据类型 string
NUMERIC
、BIGNUMERIC
、DATE
、TIME
、DATETIME
或TIMESTAMP
number
NUMERIC
、BIGNUMERIC
、DATE
、TIME
、DATETIME
或TIMESTAMP
- 使用
number
将转化设置为DATE
、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、Protocol Buffer)和编码(JSON、二进制)。如需了解这些因素如何影响额外字段的处理,请参阅特定架构类型和编码的文档。
写入元数据
此选项可让 Pub/Sub 将每条消息的元数据写入 BigQuery 表中的其他列。否则,元数据不会写入 BigQuery 表。
如果您选择写入元数据选项,请确保 BigQuery 表具有下表中所述的字段。
如果您未选择写入元数据选项,则目标 BigQuery 表仅需要 data
字段,除非 use_topic_schema
为 true。如果您同时选择写入元数据和使用主题架构选项,则主题的架构不得包含任何名称与元数据参数名称相同的字段。此限制包括这些 snake case 参数的 camelcase 版本。
参数 | |
---|---|
subscription_name |
STRING 订阅的名称。 |
message_id |
STRING 消息的 ID |
publish_time |
TIMESTAMP 发布消息的时间。 |
data |
BYTES、STRING 或 JSON 消息正文。 对于未选择使用主题架构或使用表架构的所有目标 BigQuery 表, |
attributes |
STRING 或 JSON 包含所有消息属性的 JSON 对象。它还包含 Pub/Sub 消息的其他字段,包括排序键(如果存在)。 |
创建 BigQuery 订阅
以下示例演示了如何创建使用 BigQuery 传送的订阅。
控制台
在 Trusted Cloud 控制台中,前往订阅页面。
点击创建订阅。
在订阅 ID 字段中,输入一个名称。 如需了解如何命名订阅,请参阅主题或订阅命名指南。
从下拉菜单中选择或创建一个主题。订阅将接收来自该主题的消息。
选择交付类型,然后选择写入 BigQuery。
选择 BigQuery 表的项目。
选择现有数据集或创建新数据集。 如需了解如何创建数据集,请参阅创建数据集。
选择现有表格或创建新表格。 如需了解如何创建表格,请参阅创建表格。
我们强烈建议您启用 Dead lettering 来处理消息失败问题。 如需了解详情,请参阅死信主题。
点击创建。
您还可以通过主题页面创建订阅。 此快捷方式可帮助您将主题与订阅关联。
gcloud
-
In the Trusted Cloud console, activate Cloud 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 库,请参阅迁移到 v2 的指南。如需查看 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 库,请参阅 迁移到 v3 的指南。如需查看 Ruby v2 代码示例的列表,请参阅 已弃用的代码示例。
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
监控 BigQuery 订阅
Cloud Monitoring 提供了许多指标来监控订阅。
如需查看与 Pub/Sub 相关的所有可用指标及其说明的列表,请参阅 Pub/Sub 监控文档。
您还可以在 Pub/Sub 中监控订阅。
后续步骤
- 使用
gcloud
命令创建或修改订阅。 - 使用 REST API 创建或修改订阅。
- 排查 BigQuery 订阅方面的问题。