我正在编写一个简单的流传输管道(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,但那也不能解决我的问题!
答案 0 :(得分:1)
Apache Beam从数据源读取/写入的转换具有许多优化/技巧。
执行向BigQuery进行流插入的Apache Beam转换也不例外。 performs batching of rows,然后再写入BigQuery。这可能会增加几秒钟的延迟,以使数据可供查询。
BigQuery还会运行许多后台任务以进行查询优化。流插入被添加到一个特殊的缓冲区中,该缓冲区随后被加载到表中。这可能会增加额外的数据可用性延迟。
FWIW,1-2小时听起来太长了延迟。
答案 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
让我们看看:
从我的脚本到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秒。
请注意我对此管道的设置: