简单测试流传输管道(在运行Dataflow时)::数据不流经

时间:2019-03-07 05:07:29

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

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

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

也没有任何内容流式传输到BQ(我通过运行查询来确认它:SELECT * FROM sw.payload)。 有人可以解释我的代码中有什么问题吗?这阻止了数据形式通过管道步骤?我希望当消息发布到PubSub时,几乎所有内容都会实时传输到BQ。

我没有使用任何分组/聚合转换,因此看不到任何原因,在此窗口/触发器可能会引起任何问题(如果我弄错了,请纠正我!)。

在此先感谢您提供任何线索!

更新:从头开始编写另一条管道,在BQ中显示的<10秒内,数据似乎运行良好!对于此管道,数据似乎卡在了BQ Streaming缓冲区中(请参阅截屏,摄于@ 22:15:00)。找到了另一个相关的SO线程Streaming buffer - Google BigQuery,但那也不能解决我的问题!

2 个答案:

答案 0 :(得分:1)

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

执行向BigQuery进行流插入的Apache Beam转换也不例外。 performs batching of rows,然后再写入BigQuery。这可能会增加几秒钟的延迟,以使数据可供查询。

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

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


签出有趣的blog post on the Life of a Streaming Insert

答案 1 :(得分:1)

我想添加一些数据作为上下文:

我当前正在流式发布Pub / Sub-> Dataflow-> BigQuery,并且延迟很小。

SELECT CURRENT_TIMESTAMP(), MAX(ts)
  , TIMESTAMP_MILLIS(CAST(JSON_EXTRACT(ARRAY_AGG(message ORDER BY ts DESC LIMIT 1)[OFFSET(0)], '$.mtime') AS INT64))
FROM `pubsub.meetup_201811` 

2019-03-08 23:29:59.050310 UTC
2019-03-08 23:29:57.620443 UTC
2019-03-08 23:29:57.504 UTC

让我们看看:

  • 23:29:57.504-由消息源设置的原始消息时间。
  • 23:29:57.620443-脚本添加的时间戳,该脚本从源中读取并推送到pub / sub
  • 23:29:59.050310-当前时间

从我的脚本到BigQuery,显示不到2秒。

让我再次运行该查询:

2019-03-08 23:36:48.264672 UTC
2019-03-08 23:36:47.020180 UTC
2019-03-08 23:36:46.912 UTC

在这里,脚本和查询之间的间隔不到1.2秒。

第三次:

2019-03-08 23:40:13.327028 UTC
2019-03-08 23:40:12.428090 UTC
2019-03-08 23:40:12.255 UTC

1.1秒。

请注意我对此管道的设置:

  • 普通发布/订阅。
  • GCP模板(Java)提供的BigQuery数据流。
  • 以某种方式,Dataflow报告的管道速度比我们实际看到的慢。

enter image description here enter image description here