flink中的ProcessWindowFunction经常用在窗口触发后对结果的数据的迭代处理以及获得窗口的开始时间和截止时间等操作。它可以结合reduce,aggregate等一起使用。但是使用过程中需要注意:
- 如果ProcessWindowFunction没有结合reduce,aggregate等其他窗口函数来计算的话,他是会缓存落入该窗口的所有数据,等待窗口触发的时候再一起执行ProcessWindowFunction中的process方法的,如果数据量太大很可能会导致OOM,建议在ProcessWindowFunction之前加入一个reduce,aggregate等算子,这些算子会在数据落入窗口的时候就执行reduce等操作,而不是缓存直到窗口触发执行的时候才进行reduce操作,从而避免了缓存所有窗口数据,窗口触发的时候ProcessWindowFunction拿到的只是reduce操作后的结果。
- 在window中使用Evictor操作的时候,无论window是否有reduce等其他算子,window一律缓存窗口的所有数据,等到窗口触发的时候先执行evictor方法,再执行reduce,最后再执行ProcessWindowFunction操作,源代码是通过EvictingWindowOperator这个类来实现的对比没有Evictor时效率低了很多,如果窗口缓存的数据量很大的话也会导致OOM的发生,使用Evictor时要谨慎!