来自 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 的模板,并且它已经处理了可能的极端情况。
我对其进行了如下测试并且效果很好:
在你里面创建一个subscription
PubSub 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