在Apache Beam中强制流式传输空窗格/窗口

时间:2017-08-01 18:19:44

标签: google-cloud-dataflow apache-beam

我正在尝试实现一个管道并接收一个数据流,如果在分钟间隔中有任何元素,则每分钟输出一个True,如果没有,则输出False。如果持续时间内没有元素,则窗格(具有永久时间触发器)或窗口(固定窗口)似乎不会触发。

我想的一个解决方法是将流放入全局窗口,使用ValueState保持队列以累积数据,并使用计时器作为检查队列的触发器。我想知道是否有更简洁的方法来实现这一点。

感谢。

3 个答案:

答案 0 :(得分:2)

我认为你的计时器和状态解决方案是一个很好的方法。但是,请记住,在收到密钥的至少一个元素之前,不会设置计时器。

如果这是一个问题,那么你可以做的另一件事就是注入一个PCollection,这样每个窗口都保证至少有一个虚拟元素。然后,您可以使用ValueState来检查虚拟元素之外的任何元素是否已到达。或者在窗口上使用Count.PerElement并检查该窗口是否有超过1个元素(一个附加元素,不是虚拟元素)。

答案 1 :(得分:0)

我相信您可以通过设置来实现此功能

.withAllowedLateness(Duration.ZERO, Window.ClosingBehavior.FIRE_ALWAYS)

在您的窗口化步骤中。

答案 2 :(得分:0)

我认为 Beam 人称这种模式为“循环计时器”(https://beam.apache.org/blog/looping-timers/https://www.youtube.com/watch?v=Q_v5Zsjuuzg)。这个问题有几种解决方案,但也有一些权衡。

请务必阅读细则!例如,在撰写本文时(21 年 1 月),Google Cloud Dataflow Runners Drain 功能不支持循环计时器,但将来可能会发生变化:https://beam.apache.org/documentation/runners/capability-matrix/