一:WaterMark
本质:时间戳
作用:用于处理乱序事件
适用场景:基于事件时间做窗口运算
产生频率:默认是来一条数据下发一次watermark,但是可以调整setAutoWatermarkInterval参数设置下发watermark的时间间隔,性能会有一定的提升。
多并发的情况下,取wateramark最小的一个,例如:p1-> 12,p2->14,p3->8,则watermark取最小的8
获取watermark的位置:最好紧跟着source
说明:source端假设有两个并发,并发1的wateramark是33,并发2的watermark是88,那么source的watermark就取最小的那个33,但是如果在map之后获取watermark,由于是并发的,多个并发之间的数据没有顺序,可能来的数据的wateramark是50,但是很多数据产生的watermark都小于50,这样就会导致数据大量丢失,所以watermark的获取最好紧跟着source。
二:Window
2.1 类型汇总
窗口分为三种,timewindow、countwindow和自定义的window。timewindow还分为滚动窗口,滑动窗口和会话窗口,图中没有画出,比较常用的是滚动窗口。
2.2 滚动窗口
窗口大小是人为设置的,一条事件同时只能在一个窗口中,窗口之间不重叠。
2.3 滑动窗口
窗口大小是人为设置的,滑动的大小也是人为设置的,一条事件可能同时存在于多个窗口中,窗口之间可重叠。
2.4 会话窗口
窗口没有固定的开始和结束时间,窗口不重叠。
三:Window和watermark的结合处理数据乱序问题
这里面有两个时间概念:生成watermark的时候,允许乱序的时间和allowedLatest。
通过运行结果可以看出:第一条数据进来的时候,生成一个窗口为[15,20),第二条数据进来的时候同样属于第一个窗口,当第三条数据进来的时候,产生的watermark大于第一个窗口的结束时间,所以第一个窗口触发计算,产生结果,当第四条数据进来的时候,由于第一个窗口还没有销毁并且属于第一个窗口,所以可以再次触发窗口运算,第一个窗口的销毁时间为2019-05-30 17:12:22,也就是当watermark的时间大于这个值的时候,再来属于该窗口的数据就属于延迟数据,不能触发运算,之后进来的数据依旧是如此。