flink session window窗口的条件是元素间隔大于gap 还是 大于等于gap?session window是怎么进行合并的?还是通过官方示例:org.apache.flink.streaming.examples.windowing.SessionWindowing 进行分析:
主要是修改了下数据源,首先添加8这条数据执行结果如下:
从结果可以看出 b 都在同一个窗口计算。再将8改成9 执行结果如下:
从结果可以看出(b,9,1) 跟其它key为b的属于不同窗口计算。9-5>3,大于grap会生成不同窗口。具体逻辑可以从源码看出,flink session window 窗口操作的逻辑主要在WindowOperator类中:
session window 在这个if条件判断内(有兴趣可以挂个断掉调试下),这里的大概逻辑是一条数据进来分配一个window,获取key,判断是否为session window,是session window进入if 判断内进行处理,否则进入else里处理。这次我们主要分析下窗口是怎么触发合并的,我们主要看下 mergingWindows.addWindow方法:
这段新数据分配的窗口和获取该数据key历史的窗口,传递到mergeWindows方法中进行合并。mergeWindows方法如下:
主要的窗口合并判断的逻辑在else if这块
通过这两个方法可以很清楚的了解窗口触发合并的机制。