Apache flink 如何使用Flink对无序事件时间流进行排序
介绍如何使用Flink SQL对无序流进行排序,但我更愿意使用DataStream API。要做到这一点,ProcessFunction使用PriorityQueue缓冲事件,直到水印指示事件不再无序,但RocksDB状态后端的性能很差(问题是每次访问PriorityQueue都需要整个PriorityQueue的ser/de)。无论使用哪种状态的后端,如何有效地执行此操作?更好的方法(这或多或少是由Flink的SQL和CEP库在内部完成的)是在MapState中缓冲无序流,如下所示: 如果要独立地对每个键进行排序,则首先对流进行键排序。否则,对于全局排序,请按常量为流设置键,以便可以使用KeyedProcessFunction实现排序 在该流程函数的Apache flink 如何使用Flink对无序事件时间流进行排序,apache-flink,flink-streaming,Apache Flink,Flink Streaming,介绍如何使用Flink SQL对无序流进行排序,但我更愿意使用DataStream API。要做到这一点,ProcessFunction使用PriorityQueue缓冲事件,直到水印指示事件不再无序,但RocksDB状态后端的性能很差(问题是每次访问PriorityQueue都需要整个PriorityQueue的ser/de)。无论使用哪种状态的后端,如何有效地执行此操作?更好的方法(这或多或少是由Flink的SQL和CEP库在内部完成的)是在MapState中缓冲无序流,如下所示: 如果要独
open
方法中,实例化MapState对象,其中键是时间戳,值是具有相同时间戳的流元素列表
在onElement
方法中:
- 如果某个事件延迟,请将其丢弃或发送到输出端
- 否则,将事件附加到对应于其时间戳的映射条目中
- 为此事件的时间戳注册事件时间计时器
当调用
onTimer
时,该时间戳映射中的条目就可以作为排序流的一部分发布了——因为当前水印现在指示所有早期事件都应该已经处理过了。不要忘记在向下游发送事件后清除映射中的条目。为什么需要在KeyedProcessFunction中进行排序?为什么常规ProcessFunction不能用于全局排序?因为只有KeyedProcessFunction可以使用事件时间计时器,并且可以方便地使用keyed状态。但您可以使用自定义运算符和运算符状态实现全局排序。