首页 > 解决方案 > 简单的测试流式传输管道(在 Dataflow 上运行):: 数据未流过

问题描述

我正在编写一个简单的流式管道(Apache Beam 2.11 SDK,Python 2.7.10)并在 Dataflow 运行器上运行它,读取表单 Pub/Sub >> 应用元素方式的 beam.Map() 转换 >> 接收到 BigQuery(The代码是https://github.com/vibhorj/gcp/blob/master/df/streaming.py

正如您在下面的屏幕截图中看到的,它只是停留在第 2 步,map() 转换。输入集合已读取 265 个元素,但输出集合为空。即使此步骤的数据水印几乎是实时进行的!

也没有任何内容流式传输到 BQ(我通过运行查询确认了这一点: SELECT * FROM sw.payload)。谁能解释我的代码中阻止数据形式流过管道步骤的问题?当消息发布到 PubSub 时,我希望事情几乎实时地流式传输到 BQ 接收器。

我没有使用任何分组/聚合转换,因此看不到任何原因 Windowing / Triggers 可能会导致任何问题(如果我弄错了,请纠正我!)。

在此先感谢您提供解决此问题的任何线索!

更新:从头开始编写另一个管道,它似乎工作正常,在 <10 秒内数据出现在 BQ 中!对于这个管道,数据似乎停留在 BQ Streaming 缓冲区中(参见屏幕截图,拍摄于 @22:15:00)。找到了另一个相关的 SO 线程Streaming buffer - Google BigQuery,但这也不能解决我的问题!

标签: python-2.7google-bigquerygoogle-cloud-dataflow

解决方案


Apache Beam 从数据源读取/写入的转换有许多优化/技巧。

对 BigQuery 执行流式插入的 Apache Beam 转换也不例外。它在写入 BigQuery 之前执行行批处理。这可能会增加几秒钟的延迟,以使数据可用于查询。

BigQuery 也会运行许多后台任务以进行查询优化。流式插入被添加到稍后加载到表中的特殊缓冲区中。这可能会增加数据可用性的额外延迟。

FWIW,1-2 小时听起来延迟太长了。


查看有关流式插入的生命周期的有趣博客文章


推荐阅读