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