【问题标题】:Forcing an empty pane/window in streaming in Apache Beam在 Apache Beam 中强制流式传输中的空窗格/窗口
【发布时间】:2017-08-01 18:19:43
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: google-cloud-dataflow apache-beam


    【解决方案1】:

    我认为您的计时器和状态解决方案是实现此目的的好方法。但是,请记住,在您收到至少一个键元素之前,不会设置您的计时器。

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

    【讨论】:

    【解决方案2】:

    我相信你可以通过设置来实现这种行为

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

    在您的窗口化步骤中。

    【讨论】:

    • 这不起作用(尝试结合滑动和全局窗口)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2018-05-31
      • 2021-12-22
      • 2021-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2021-01-07
      相关资源
      最近更新 更多