在Flink流媒体中处理最后1小时,1周和1个月数据的事件

时间:2017-06-14 05:57:48

标签: apache-flink flink-streaming

我必须处理每个事件的最后1小时,1周和1个月的数据。与此事件相对应的最近1个月内发生的IP次数相同。

我认为窗口是固定时间,我无法计算与当前事件相对应的最后1小时。

如果您有任何线索,请指导我应该使用Table,ProcessFunction或全局窗口。或者我应该采取什么方法?

1 个答案:

答案 0 :(得分:3)

有一个原因是为什么这种窗口不支持开箱即用Flink,这与保持必要状态的内存要求有关。以通常完成的方式每小时计数事件(即,从10:00到11:00的小时)仅需要保持在从零开始并随每个事件递增的计数器周围。计时器会在一小时结束时触发,并且可以发出计数器。

在每个时刻提供前60分钟内的事件计数将要求窗口操作员在内存中保存每个事件的时间戳,并在每次发出结果时进行大量计数。

如果您真的打算这样做,我建议您确定需要提供更新结果的频率。例如,对于每分钟一次的更新,您可以在仅存储每分钟计数而不是每个事件的情况下逃脱。

这有帮助,但情况仍然很糟糕。例如,您可能想要使用滑动窗口,该窗口每分钟提供过去一个月的事件计数。但这也会很痛苦,因为你会实例化60 * 24 * 30 = 43,400个窗口对象,所有这些都是并行计数。

Flink API中的相关构建块是ProcessFunction,这是使用Windows执行此操作的有趣替代方法,如果您决定坚持使用Windows,则自定义TriggersEvictors。请注意,它也可以查询Flink中的状态,而不是按计划发出 - 请参阅queryable state