Flink Streaming:如何使用过去30天的所有事件处理每个事件?

时间:2016-11-04 22:55:27

标签: apache-flink

在键控流上,我想在新事件到达时立即为每个新传入事件计算一次窗口函数,同时在过去30天内向其提供此密钥的所有早期事件的上下文作为迭代器。

预期的行为类似于30天长度和1纳秒幻灯片的滑动窗口,每个传入事件只计算一次窗口函数。

我无法看到如何在内置的Tumbling / Sliding / Session窗口中使用/不使用Triggers / Evictors等来映射此行为。

有人可以帮忙吗?或者这是否需要编写我自己的Window Assigner或我自己的键控状态处理?

1 个答案:

答案 0 :(得分:3)

你是对的,使用Flink提供的窗口基元来建模用例并不容易。

我能想到的最佳解决方案是实现自定义运算符(OneInputStreamOperator)。这是一个相当低级的接口,可以访问记录时间戳,水印和状态(许多Flink的内置运算符都基于该接口)。当收到新记录时,操作员将把它放入按时间戳排序的优先级队列,删除30天之前的所有元素,并评估队列中其余元素的功能。

请注意,队列应注册为托管状态,以使操作员具有容错能力。如果要使用事件时间,则只能在收到水印时执行评估和删除数据。

在实施OneInputStreamOperator界面时,可能有助于查看Flink的内置运算符,例如StreamFilter或其中一个更复杂的运算符。

可以使用DataStream方法在KeyedStreamDataStream.keyBy()(由transform()获取)上应用自定义运算符。