Google cloud dataflow 如何";“利率限额”;Apache Beam中的PCollection?
我有一个看起来很常见的问题,但我不知道Beam推荐的解决方案是什么 我有一个原始事件流,我正在寻找两个独立的事件来满足滑动窗口(60分钟)内的条件,以便它“触发”警报 使用Google cloud dataflow 如何";“利率限额”;Apache Beam中的PCollection?,google-cloud-dataflow,apache-beam,stream-processing,Google Cloud Dataflow,Apache Beam,Stream Processing,我有一个看起来很常见的问题,但我不知道Beam推荐的解决方案是什么 我有一个原始事件流,我正在寻找两个独立的事件来满足滑动窗口(60分钟)内的条件,以便它“触发”警报 使用滑动窗口很容易做到这一点,但问题在于它的滑动特性,我可以在多个窗口中有效地获得该警报。如何最终获得只输出一次此类警报的PCollection(在特定时间段/冷却持续时间内) 我最初认为最近的有状态处理特性将是我的解决方案,但后来意识到它只在一个窗口内工作。侧面输入也是如此。因此,在我看来,我需要一种打破窗口的方法,并在一个(可
滑动窗口
很容易做到这一点,但问题在于它的滑动特性,我可以在多个窗口中有效地获得该警报。如何最终获得只输出一次此类警报的PCollection(在特定时间段/冷却持续时间内)
我最初认为最近的有状态处理特性将是我的解决方案,但后来意识到它只在一个窗口内工作。侧面输入也是如此。因此,在我看来,我需要一种打破窗口的方法,并在一个(可能的会话)窗口中处理警报“触发”。但是文档中没有提到任何有效地将元素重新分配给新windows的方法有趣的应用程序 总结一下:
- 听起来,对于您的用例来说,“滑动窗口”意味着持续滑动。您可以选择最小粒度,但它不一定是自然的
- 您感兴趣的每一组事件应该只产生一个输出
另一种方法是将滑动窗口与
组合
或状态(基本上是您已经尝试过的)一起使用,然后重新打开警报窗口并消除重复。您可以为此使用固定窗口,因为警报应具有确定的时间戳;窗口的结尾将控制何时自动收集状态,以便方便使用。我最后使用了一种重新窗口策略,类似于@Kenn建议的
因此,我有来自滑动窗口集合的警报,我将其重新窗口化到会话窗口中
.apply(Window.remerge())
.apply(Window.into(Sessions.withGapDuration(Duration.standardHours(1))))
在这个窗口集合中,我只需执行一个
groupBy
,就可以获得会话的所有警报
,在此期间,我可以应用我的冷却逻辑,即每小时只发出一次警报。Kenn,感谢您的回复。实际上,我忘了用我的发现更新这个问题。关于您的建议:>一种方法是将数据保留在全局窗口中并使用状态。这确实是一种选择,但我会不会错过使用beam then的要点?>另一种方法是使用带联合收割机或状态的滑动窗口(基本上是您已经尝试过的),然后重新打开警报窗口并消除重复。我有效地采用了这个解决方案。但是,固定窗口不起作用,因为我可能在窗口的后半部分有一个警报,从而重置“冷却”,因此下一个窗口中的任何早期警报都不会被触发。