在键流上,我想在新事件到达时立即为每个新传入事件计算一次窗口函数,同时为它提供过去30天内该键的所有早期事件的上下文作为迭代器。
预期行为类似于30天长度和1纳秒滑动的滑动窗口,每个传入事件仅计算一次窗口函数。
我不知道如何将此行为映射到内置的滚动/滑动/会话窗口上,有/没有触发器/驱逐器等。
有人能帮忙吗?或者这是否需要编写我自己的窗口赋值器或我自己的键状态处理?
你是对的,用Flink提供的窗口原语来建模你的用例是不容易的。
我能想到的最好的解决方案是实现一个自定义运算符(OneInputStreamOperator
)。这是一个相当低级的接口,可以访问记录时间戳、水印和状态(Flink的许多内置操作符都基于该接口)。当接收到一条新记录时,操作符将其放入按时间戳排序的优先队列中,删除所有早于30天的元素,并对队列中剩余的元素进行函数计算。
注意,队列应该注册为托管状态,以使操作符容错。如果要使用事件时间,则只能在接收到水印时执行计算和删除数据。
在实现OneInputStreamOperator
接口时,查看Flink的内置操作符(如StreamFilter
或更复杂的操作符)可能会有所帮助。
自定义运算符可以使用transform()
方法应用于DataStream
或KeyedStream
(由DataStream.keyBy()
获得)。