来自 Dataflow 的 BigQuery 流式插入 - 没有结果

Posted

技术标签:

【中文标题】来自 Dataflow 的 BigQuery 流式插入 - 没有结果【英文标题】:BigQuery streaming insert from Dataflow - no results 【发布时间】:2021-12-02 13:37:37 【问题描述】:

我有一个 Dataflow 管道,它从 PubSub Lite 读取消息并将数据流式传输到 BigQuery 表中。该表按天分区。查询表时:

SELECT * FROM `my-project.my-dataset.my-table` WHERE DATE(timestamp) = "2021-10-14"

BigQuery 用户界面告诉我 This query will process 1.9 GB when run。但是当实际运行查询时,我没有得到任何结果。我的管道现在运行了一整周,过去两天我得到了相同的结果。但是,对于 2021-10-11 和之前的几天,我看到了实际结果。

我目前使用的是 Apache Beam 2.26 版,我的数据流编写器如下所示:

return BigQueryIO.<Event>write()
    .withSchema(createTableSchema())
    .withFormatFunction(event -> createTableRow(event))
    .withCreateDisposition(CreateDisposition.CREATE_NEVER)
    .withWriteDisposition(WriteDisposition.WRITE_APPEND)
    .withTimePartitioning(new TimePartitioning().setType("DAY").setField("timestamp"))
    .to(TABLE);

为什么 BigQuery 花了这么长时间将值提交到分区,但同时告诉我实际上有可用数据?

编辑 1:

【问题讨论】:

如果您的表确实是分区创建的,并且该日期没有数据,查询编辑器应该告诉您将处理 0b,这就是分区的工作方式。根据您的描述,接缝表分区无法正常工作。请在 BigQuery 上打开您的表并查看详细信息 -> 表信息,您可以看到字段 Table Type Partitioned Partitioned by DAY 请同时提供您的数据示例和数据架构(请删除敏感信息)。这样我可以尝试重现。 此外,向主题发布一条包含表数据的消息,并在数据流作业中显示输出,它必须说明数据是否已写入或是否发生了错误。 gcloud pubsub topics publish test-topic --message='"ts": "2021-10-25 00:00:00 UTC","storeName":"zabka","itemId": "3","itemName": "New line from dataflow"' 【参考方案1】:

BigQuery 正在处理数据并且不返回任何行,因为它还处理流式缓冲区中的数据。缓冲区上的数据最多可能需要 90 分钟才能提交到分区表中。

查看此stack 以及可用文档here 中的更多详细信息。

When streaming to a partitioned table, data in the 
streaming buffer has a NULL value for the _PARTITIONTIME pseudo column.

如果您在 BigQuery 中从 pubsub 写入数据时遇到问题,我建议您使用数据流中可用的模板。

使用 GCP 中可用的 Dataflow 模板将数据从 PubSub 写入 BigQuery:

有一种将数据从 pubsub 主题写入 bigquery 的模板,并且它已经处理了可能的极端情况。

我对其进行了如下测试并且效果很好:

在你里面创建一个subscriptionPubSub topic; 创建bucket 用于临时存储; 按如下方式创建作业: 为了测试,我只是以json格式向主题发送了一条消息,并在输出表中添加了新数据:

gcloud pubsub topics publish test-topic --message='"field_dt": "2021-10-15T00:00:00","field_ts": "2021-10-15 00:00:00 UTC","item": "9999"'

如果您想要更复杂的东西,您可以从 github 的模板代码中分叉并根据需要进行调整。

【讨论】:

你好@p13rr0m。你成功了吗? 感谢您的帮助。我认为它现在正在工作,但我不完全确定。我的假设是问题来自处理缓慢的 Dataflow 管道,该管道尚未能够处理过去几天的消息。因此,我在 BigQuery 中看到的信息有点误导,因为管道当天还没有写任何消息。我不知道为什么 BigQuery 用户界面向我显示已经有数据并且为什么它还在增加。

以上是关于来自 Dataflow 的 BigQuery 流式插入 - 没有结果的主要内容,如果未能解决你的问题,请参考以下文章

在 Dataflow 流式传输管道上捕获 BigQuery HttpBadRequestError

直接流式传输到 BigQuery 与通过 Google Pub/Sub + Dataflow 流式传输的优缺点

从 BigQuery 缓慢更改查找缓存 - Dataflow Python 流式 SDK

Bigquery 流式插入使用具有空字段的数据流

Dataflow 是不是应该使用来自 Pub/Sub 主题或订阅的事件? [复制]

为啥使用 Dataflow 写入 Bigquery 非常慢?