首页 > 解决方案 > 从 PubSub 导出到 BigQuery - Dataflow 没有任何反应

问题描述

我正在尝试设置 Dataflow 作业以将 PubSub 主题中的数据写入 BigQuery 表。我从 PubSub 主题控制台中单击了“导出到 BigQuery”,并采取了以下详细步骤。创建作业后,我看到的流程图有一个“WriteSuccessfulRecords”框,其中时间信息会逐渐增加,并且日志查看器会报告无休止的消息,如下所示:

Operation ongoing in step WriteSuccessfulRecords/StreamingInserts/StreamingWriteTables/StreamingWrite for at least 55m00s without outputting or completing in state finish
  at java.base@11.0.2/jdk.internal.misc.Unsafe.park(Native Method)
  at java.base@11.0.2/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
  at java.base@11.0.2/java.util.concurrent.FutureTask.awaitDone(FutureTask.java:447)
  at java.base@11.0.2/java.util.concurrent.FutureTask.get(FutureTask.java:190)
  at app//org.apache.beam.sdk.io.gcp.bigquery.BigQueryServicesImpl$DatasetServiceImpl.insertAll(BigQueryServicesImpl.java:817)
  at app//org.apache.beam.sdk.io.gcp.bigquery.BigQueryServicesImpl$DatasetServiceImpl.insertAll(BigQueryServicesImpl.java:882)
  at app//org.apache.beam.sdk.io.gcp.bigquery.StreamingWriteFn.flushRows(StreamingWriteFn.java:143)
  at app//org.apache.beam.sdk.io.gcp.bigquery.StreamingWriteFn.finishBundle(StreamingWriteFn.java:115)
  at app//org.apache.beam.sdk.io.gcp.bigquery.StreamingWriteFn$DoFnInvoker.invokeFinishBundle(Unknown Source)

当我单击 WriteSuccessfulRecords 时,我最终会看到“StreamingWrite”框,同时显示(这个时间是什么意思?)。WriteSuccessfulRecords(和 StreamingWrite 等)框中的“运行”时间目前超过 2 天,我大约一个小时前创建了该作业。它以前达到了接近 100 小时而没有输出。

我的 BigQuery 表作为一个空表存在,其中包含来自 PubSub 的预期数据架构。我已从 BigQuery 详细信息选项卡中复制了表 ID,并将其复制到 Dataflow 设置中的相应框中(格式为 project-id:dataset.table-name)。BQ 数据集与 Dataflow 作业位于同一区域,尽管我不确定这有多相关。我的 Cloud Storage 临时存储位置也是有效的,我再次将存储位置复制到 Dataflow 设置中。

其他数据流设置信息:

  1. 我正在使用模板“Pub/Sub Topic to BigQuery”。
  2. 输入 Pub/Sub 主题是项目//topics/
  3. 我们使用共享 VPC,因此我指定了完整路径,类似于https://www.googleapis.com/compute/v1/projects/[pubsub project id]/regions/europe-west2/subnetworks/[subnet name]
  4. 还指定了服务帐户电子邮件地址
  5. 我的工作区域也设置为与 BigQuery 和 Pub/Sub 区域相同,以防万一。

这个设置有什么明显的我错过的吗?我应该采取哪些后续步骤才能在 Dataflow 设置方面取得进展?

提前致谢,

托尼

标签: google-bigquerygoogle-cloud-dataflowgoogle-cloud-pubsub

解决方案


事实证明,服务帐户需要一些额外的权限才能写入 BigQuery。

我不确定流式插入的最低角色是什么,但我的猜测是roles/bigquery.dataEditorand roles/bigquery.user。/iam-admin/iam 页面将分析服务帐户的最小权限集,因此您可以从 BigQuery Admin 开始并缩小范围。另一种策略是查看数据流日志 [1] 以了解服务帐户需要什么样的权限。

[1]“BigQuery insertAll 错误,重试:访问被拒绝:表项目:dataset.table 用户没有表项目:dataset.table 的bigquery.tables.get权限。”


推荐阅读