Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flink 如何使用Flink对无序事件时间流进行排序_Apache Flink_Flink Streaming - Fatal编程技术网

Apache flink 如何使用Flink对无序事件时间流进行排序

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中缓冲无序流,如下所示: 如果要独

介绍如何使用Flink SQL对无序流进行排序,但我更愿意使用DataStream API。要做到这一点,ProcessFunction使用PriorityQueue缓冲事件,直到水印指示事件不再无序,但RocksDB状态后端的性能很差(问题是每次访问PriorityQueue都需要整个PriorityQueue的ser/de)。无论使用哪种状态的后端,如何有效地执行此操作?

更好的方法(这或多或少是由Flink的SQL和CEP库在内部完成的)是在MapState中缓冲无序流,如下所示:

如果要独立地对每个键进行排序,则首先对流进行键排序。否则,对于全局排序,请按常量为流设置键,以便可以使用KeyedProcessFunction实现排序

在该流程函数的
open
方法中,实例化MapState对象,其中键是时间戳,值是具有相同时间戳的流元素列表

onElement
方法中:

  • 如果某个事件延迟,请将其丢弃或发送到输出端
  • 否则,将事件附加到对应于其时间戳的映射条目中
  • 为此事件的时间戳注册事件时间计时器

当调用
onTimer
时,该时间戳映射中的条目就可以作为排序流的一部分发布了——因为当前水印现在指示所有早期事件都应该已经处理过了。不要忘记在向下游发送事件后清除映射中的条目。

为什么需要在KeyedProcessFunction中进行排序?为什么常规ProcessFunction不能用于全局排序?因为只有KeyedProcessFunction可以使用事件时间计时器,并且可以方便地使用keyed状态。但您可以使用自定义运算符和运算符状态实现全局排序。