累积延迟数据并在5分钟后触发它们

时间:2019-07-23 14:53:34

标签: google-cloud-dataflow apache-beam

我有一个Google Dataflow作业,该作业从PubSub读取数据,聚合数据,最后将数据发送到InflluxDB。我要实现的是在1分钟的窗口中聚合数据,但是每分钟在DB中只有一个条目。问题是我想允许延迟数据,所以我需要在5分钟的时间内累积数据,然后将唯一的条目发送给DB。

有可能吗?我尝试使用下面的代码来做到这一点,但我没有得到想要的东西:

input.apply(Window
  .<KV<String, String>>into(FixedWindows.of(Duration.standardMinutes(1)))
  .triggering(
      AfterProcessingTime
        .pastFirstElementInPane()
        .plusDelayOf(Duration.standardMinutes(5)))
  .withAllowedLateness(Duration.standardMinutes(5))
  .discardingFiredPanes()

1 个答案:

答案 0 :(得分:1)

我已经在类似的question上进行了合作。您可以使用.triggering(Never.ever())忽略发送ON TIME窗格。然后,正如您已经在做的那样,将允许的延迟时间设置为5分钟以进行延迟记录。

Window.ClosingBehavior更改为FIRE_ALWAYS也很重要。这样,我们可以解决没有迟到的数据但没有发出准时记录的情况。关闭窗口后,它将始终发出最终窗格,其中PaneInfo.isLast设置为true。

因此,对于您的情况,代码将类似于:

input.apply(Window
  .<KV<String, String>>into(FixedWindows.of(Duration.standardMinutes(1)))
  .triggering(Never.ever())
  .withAllowedLateness(Duration.standardMinutes(5), Window.ClosingBehavior.FIRE_ALWAYS)
  .discardingFiredPanes()