python-2.7 - 简单的测试流式传输管道(在 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,但这也不能解决我的问题!
解决方案
Apache Beam 从数据源读取/写入的转换有许多优化/技巧。
对 BigQuery 执行流式插入的 Apache Beam 转换也不例外。它在写入 BigQuery 之前执行行批处理。这可能会增加几秒钟的延迟,以使数据可用于查询。
BigQuery 也会运行许多后台任务以进行查询优化。流式插入被添加到稍后加载到表中的特殊缓冲区中。这可能会增加数据可用性的额外延迟。
FWIW,1-2 小时听起来延迟太长了。
推荐阅读
- scala - Akka Streams,将元组项目分开?
- android - 如何从 Retrofit2 调用 OnResponse 返回 Java 对象
- error-handling - 何时调用 RTCDataChannel.onerror?
- android - 可以在 android studio 中自动填充代码语句
- python - Tkinter 中的交互式 PyPlot 图未注册 MouseEvents
- rust - Path::join 不符合预期
- dart - 使用 rootBundle 加载文件
- r - data.frame 中的错误(...,check.names = FALSE)
- xamarin - 如何在 CS 中的网格内获取第一个标签的文本?
- javascript - 使用 slideToggle on 按钮显示/隐藏信息