在 Apache Beam 中强制流式传输为空 pane/window

Forcing an empty pane/window in streaming in Apache Beam

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

我正在考虑的一种解决方法是将流放入全局 window,使用 ValueState 来保持队列以累积数据,并使用计时器作为检查队列的触发器。我想知道是否有任何更简洁的方法来实现这一目标。

谢谢。

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

如果这是一个问题,那么您可以做的另一件事是注入一个 PCollection,以便保证每个 window 至少有一个虚拟元素。然后您可以使用 ValueState 检查除虚拟元素之外的任何元素是否已到达。或者在 window 上使用 Count.PerElement 并检查 window.

是否有超过 1 个元素(一个附加元素,不是虚拟元素)

我相信您可以通过设置

实现此行为
.withAllowedLateness(Duration.ZERO, Window.ClosingBehavior.FIRE_ALWAYS)

在您的开窗步骤中。

我认为 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/