WindowFunction的触发器和ReduceFunction的触发器有什么区别?
没有"ReduceFunction Trigger"或"WindowFunction Trigger"这样的东西,因为触发器和函数是正交的。在 Flink 中,窗口操作至少由三个部分组成:
WindowAssigner
:窗口分配器决定将每条记录分配到哪个窗口。Function
:窗口的功能处理分配给窗口的记录。函数可以是ReduceFunction
、AggregateFunction
、WindowFunction
或ProcessWindowFunction
。 在收到所有记录之前,可以急切地应用ReduceFunction
和AggregateFunction
。这是有益的,因为以这种方式可以显着减少在窗口状态下存储的数据量。WindowFunction
和ProcessWindowFunction
处理窗口收集的所有记录。也可以组合一个渴望函数(ReduceFunction
,AggregateFunction
)和一个全窗口函数(WindowFunction
,ProcessFunction
)。在这种情况下,记录被急切聚合,并且最终将预先聚合结果提供给 full window 函数。Trigger
:Trigger
决定何时从窗口操作的状态发出结果和/或放弃状态。
将新记录添加到窗口时,始终会立即应用ReduceFunction
。当窗口的Trigger
触发时,将发出窗口的结果。
触发器仅适用于窗口。ReduceFunction 不需要触发器,它是一个转换操作,在每个新元素上调用processElement()
。
总之:
ReduceFunction
每个元素的触发器(类似于onElement()
窗口触发器)。
WindowFunction
触发器(默认情况下)按时(事件、处理或引入)。但它在这方面很灵活,并接受自定义触发器。
有关触发器的更多信息:
https://ci.apache.org/projects/flink/flink-docs-master/dev/stream/operators/windows.html#triggers
默认约简实现:
https://github.com/apache/flink/blob/master/flink-streaming-java/src/main/java/org/apache/flink/streaming/api/operators/StreamGroupedReduce.java