排查 BigQuery 订阅问题

本页面提供了一些常见的 BigQuery 订阅问题排查提示。

查看 BigQuery 订阅的状态

如需查看订阅的状态,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,前往 Pub/Sub 订阅页面。

    前往订阅页面

  2. 查看 BigQuery 订阅的状态图标。

    如果图标显示为绿色对勾标记,则表示订阅正常。

    如果图标是红色感叹号,则表示订阅处于错误状态。

  3. 点击 BigQuery 订阅。

    系统会打开订阅详情页面。

  4. 查看订阅状态,了解错误消息。

  5. 根据错误消息,前往本页中的相关部分排查问题。

问题解决后,订阅最终会恢复为正常状态。

无法创建或更新订阅

如果您在创建或更新 BigQuery 订阅时遇到问题,可能会遇到以下一些常见问题。

“找不到表”错误

如果您在创建或更新订阅工作流中指定的表不存在,则该工作流会返回“找不到表”错误。Google Cloud 控制台中显示的消息类似于以下内容:

The BigQuery table or dataset specified cannot be found.

如需解决此问题,请先创建表,并确保您可以查看其状态,然后再将其与 BigQuery 订阅搭配使用。

架构不匹配错误

如果表和主题的架构不兼容,则创建或更新订阅工作流会返回架构不匹配错误。Google Cloud 控制台中显示的消息类似于以下内容:

Incompatible schema type for field project_ids: expected INT64, got STRING

指定的错误消息是指名为 project_ids 的字段的架构不匹配。根据您遇到的架构不匹配类型,您可能会看到不同版本的错误消息。

如需解决此问题,请检查架构映射是否兼容

服务账号错误

如果您未使用正确的权限配置 Pub/Sub 服务账号,则创建或更新订阅工作流会返回错误。Google Cloud 控制台中显示的消息类似于以下内容:

Service account service-1234234234@gcp-sa-pubsub.iam.gserviceaccount.com
is missing permissions required to write to the BigQuery table:
bigquery.tables.get, bigquery.tables.updateData.

如需解决此问题,请检查服务账号是否具有正确的权限

订阅状态显示红色感叹号

如果您在创建订阅后修改表,则可能会影响 Pub/Sub 将消息写入表的方式。如果更改导致问题,则订阅的状态字段会设为错误状态

在“订阅详情”页面中,查看字段 Subscription state 的状态。 Subscription state 字段会提供更具体的错误,可能是以下某种错误:

  • 找不到表:表已被删除。创建表并检查表的状态。请参阅获取表信息

  • 表权限被拒:Pub/Sub 服务账号不再有权向表写入数据。检查服务账号是否具有正确的权限

  • 表架构不匹配:表架构不再与 BigQuery 订阅设置兼容。检查架构映射是否兼容

当 Pub/Sub 订阅处于错误状态时,系统不会将消息写入 BigQuery 表,而是将其保留在订阅积压队列中。请注意,系统不会将消息传送到关联的死信主题(如果已配置)。未确认的消息会保留 message_retention_duration 中设置的时间段(默认 7 天)。

积压的工作越来越多

如果您发现订阅中积累了大量待处理的消息,或者消息发送到了订阅的死信主题,请查看以下可能的原因。

INVALID_ARGUMENT 错误消息

如果所提供的消息的格式被 Pub/Sub 视为有效,但 BigQuery 目标表架构不认为有效,就会发生此错误。这意味着消息中的一个或多个字段的值不符合 BigQuery 表架构的规定。查看架构兼容性,验证数据类型和格式是否正确。最常见的一些错误包括:

  • 空字符串 ("") 不是有效的 JSON。向可为 null 的 JSON BigQuery 表列发送数据时,请提供空 JSON 对象 ({})null 或空 JSON 字符串 ("\"\"") 来表示缺失值。发送空字符串会导致错误。

  • 如果消息字段值超出 BigQuery 字段的长度上限,则消息会因大小限制而失败。

如需排查 INVALID_ARGUMENT 错误,请向相关订阅添加死信主题。死信主题会捕获无法写入 BigQuery 的消息,以及一个名为 CloudPubSubDeadLetterSourceDeliveryErrorMessage 的属性,用于说明失败原因。

您也可以在 Metrics Explorer 中查看这些传送失败情况。 选择指标 pubsub.googleapis.com/subscription/push_request_count,然后按 response_code=invalid_argument 过滤。

RESOURCE_EXHAUSTED 错误消息

如果消息写入 BigQuery 的速度缓慢,您可能需要增加项目的 Pub/Sub 推送配额或 BigQuery 存储写入吞吐量配额。如需检查您是否遇到了配额限制,请检查推送请求指标 (subscription/push_request_count),看看是否存在任何 resource_exhausted 错误。

诊断配额问题的另一种方法是检查项目的配额。在包含您的 Pub/Sub 资源或 BigQuery 实例的项目中,依次前往 IAM 和管理 > 配额。搜索相关配额(pubsub.googleapis.com/regionalpushsubscriberbigquerystorage.googleapis.com/write/append_bytes)。如果需要增加任一配额,您可以申请提高配额

每小时分区表,分区 ID 列中显示 __UNPARTITIONED__

当 BigQuery 目标表按小时分区时,行最初会位于 INFORMATION_SCHEMA.PARTITIONS 视图中标记为 __UNPARTITIONED__ 的特殊分区中。对于使用提取时间分区的表,这是预期行为。

BigQuery 采用流式缓冲区来优化写入流程。数据可能会驻留在 __UNPARTITIONED__ 分区中,直到累积到足够的量或至少经过一小时。满足这些条件后,BigQuery 会将数据重新分区到相应的小时分区中。

您可以使用 INFORMATION_SCHEMA.PARTITIONS 视图监控 __UNPARTITIONED__ 分区中的数据。

后续步骤

  • 如果您的 BigQuery 订阅仍存在问题,请参阅获取支持