从 PubSub 导出到 BigQuery - Dataflow 没有任何反应

Posted

技术标签:

【中文标题】从 PubSub 导出到 BigQuery - Dataflow 没有任何反应【英文标题】:Export To BigQuery from PubSub - nothing happens with Dataflow 【发布时间】:2021-02-18 12:51:06 【问题描述】:

我正在尝试设置 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 设置中。

其他数据流设置信息:

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

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

提前致谢,

托尼

【问题讨论】:

您的服务帐号是否有权从 Pub/Sub 读取和写入 BigQuery?您的 Dataflow 工作人员是否与您的子网 (europe-west2) 位于同一区域?当您单击“ReadPubSubTopic”步骤时,您是否从右侧的图表中看到正吞吐量? 嗨,彼得,感谢您的回复。很高兴确认您的所有查询都是肯定的——唯一的例外是我没有被授予对我的服务帐户的 BigQuery 权限(Pub/Sub 和 Dataflow 权限已经存在)。我添加了以下内容:BigQuery Admin、BigQuery Connection Service Agent、BigQuery Data Transfer Service Agent。在他们之间,他们已经启用了从 Dataflow 到 BigQuery 的写入,但我不禁觉得权限太多了 - 你知道这个用例的最低权限的最低角色吗?谢谢! 【参考方案1】:

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

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

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

【讨论】:

再次感谢彼得。我会将其转达给我的 GCP 管理员团队,以引起他们的注意。

以上是关于从 PubSub 导出到 BigQuery - Dataflow 没有任何反应的主要内容,如果未能解决你的问题,请参考以下文章

从 pubsub->bigquery 移动到 pubsub->gcs (avro)->bigquery

GCP - 从 PubSub 到 BigQuery 的消息

PubSub 到 BigQuery - Python 中的数据流/Beam 模板?

从 Pubsub 在 BigQuery 中编写查询

如何将 JSON 数据发布到 PubSub,然后推送到 BigQuery?

Bigquery 使用数据流发布订阅消息推送