在键控流上,我想在新事件到达时立即为每个新传入事件计算一次窗口函数,同时在过去30天内向其提供此密钥的所有早期事件的上下文作为迭代器。
预期的行为类似于30天长度和1纳秒幻灯片的滑动窗口,每个传入事件只计算一次窗口函数。
我无法看到如何在内置的Tumbling / Sliding / Session窗口中使用/不使用Triggers / Evictors等来映射此行为。
有人可以帮忙吗?或者这是否需要编写我自己的Window Assigner或我自己的键控状态处理?
答案 0 :(得分:3)
你是对的,使用Flink提供的窗口基元来建模用例并不容易。
我能想到的最佳解决方案是实现自定义运算符(OneInputStreamOperator
)。这是一个相当低级的接口,可以访问记录时间戳,水印和状态(许多Flink的内置运算符都基于该接口)。当收到新记录时,操作员将把它放入按时间戳排序的优先级队列,删除30天之前的所有元素,并评估队列中其余元素的功能。
请注意,队列应注册为托管状态,以使操作员具有容错能力。如果要使用事件时间,则只能在收到水印时执行评估和删除数据。
在实施OneInputStreamOperator
界面时,可能有助于查看Flink的内置运算符,例如StreamFilter
或其中一个更复杂的运算符。
可以使用DataStream
方法在KeyedStream
或DataStream.keyBy()
(由transform()
获取)上应用自定义运算符。