Apache storm Storm:跨多个不同大小的滑动窗口的最小/最大聚合

Apache storm Storm:跨多个不同大小的滑动窗口的最小/最大聚合,apache-storm,Apache Storm,我想知道在ApacheStorm中处理以下问题的最佳实践是什么 我有一个喷口,它生成一个带有显式时间戳的整数值流。目标是在此流上使用三个滑动窗口执行最小/最大聚合: 最后一小时 最后一天,即最后24小时 最后一个小时很简单: topology.setBolt("1h", ...) .shuffleGrouping("spout") .withWindow(Duration.hours(1), Duration.seconds(10)) .withTimestampFi

我想知道在ApacheStorm中处理以下问题的最佳实践是什么

我有一个喷口,它生成一个带有显式时间戳的整数值流。目标是在此流上使用三个滑动窗口执行最小/最大聚合:

  • 最后一小时
  • 最后一天,即最后24小时
最后一个小时很简单:

topology.setBolt("1h", ...)
    .shuffleGrouping("spout")
    .withWindow(Duration.hours(1), Duration.seconds(10))
    .withTimestampField("timestamp"));
但是,在较长的时间内,我关注窗口的队列大小。当我像最后一个小时的聚合一样,直接从喷口消费元组时,每个元组都会出现在队列中

一种可能是使用预先聚合的“1h”螺栓中的元组。但是,由于我使用的是显式时间戳,因此从“1h”螺栓到达的晚元组将被忽略。1小时的延迟不是一个选项,因为这会延迟窗口的评估。有没有一种方法可以“允许”延迟元组而不影响结果的及时性

当然,我也可以每小时存储一个聚合,然后计算过去24小时的最小值,包括“1h”流中的最新值。但我很好奇,是否有一种方法可以正确地使用风暴手段来做到这一点

更新1 由于arunmahadevan的回答,我更改了1h-min螺栓,以在相应的1h窗口中发出具有所有元组的最大时间戳的最小元组。这样,消费螺栓不会因为延迟到达而丢弃元组。我还引入了一个新字段
original timestamp
,以保留最小元组的原始时间戳

更新2
我最终找到了一个更好的方法,只在1小时内发出状态变化。只要没有收到新的元组,Storm就不会提前消耗螺栓中的时间,因此可以防止延迟到达问题。此外,我还可以保留原始时间戳,而无需将其复制到单独的字段中。

我认为周期性地从“1h”到“24h”发送最小值应该有效,并保持“24h”队列大小处于检查状态

如果配置滞后,则只有在该滞后之后(即,当事件时间跨越滑动间隔+滞后)才会调用螺栓的执行

假设将“1h”螺栓配置为1分钟的延迟,则只有在事件时间跨越02:01之后,才会对01:00-02:00之间的元组调用execute。(即螺栓已看到时间戳>=02:01的事件)。然而,execute将只在01:00和02:00之间接收元组


现在,如果您计算最后一个小时的最小值,并将结果发送到滑动间隔为1小时且滞后=0的“24小时”螺栓,则一旦传入事件的时间戳穿过下一个小时,它将触发。如果您发出时间戳为02:00的01:00-02:00分钟,将触发“24小时”窗口(对于前一天02:00到02:00之间的事件)一旦它收到最小事件,因为事件时间超过下一个小时,配置的延迟为0。

好的,您的回答中真正帮助我的关键部分是发出最小值和考虑中窗口的最大时间戳。您知道如何实现平均聚合的最小值吗?这是不同的,因为我不能在1h螺栓上使用滑动窗口,因为这会导致相同的元组在平均值中合并多次。有没有一种方法可以将基于滚动窗口的预聚合与源喷口中的最新元素结合起来?一旦源喷口元素被来自翻滚窗口的聚合覆盖,我就需要从队列中逐出它们。但在暴风雨中似乎不可能有定制的驱逐政策。。。