代码设置:
//水位线允许乱序2S
Stream.assignTimestampsAndWatermarks(WatermarkStrategy<~>forBoundedOutOfOrderness(Duration.ofSeconds(2));
//窗口时间10S,窗口延迟关闭3S
Stream.window(TumblingEventTimeWindows.of(Time.seconds(10))).allowedLateness(Time.seconds(3));
单独分析作用:
水位线允许乱序2:当水位线到达8的时候,会默认减去2,实际水位线为6
窗口延迟关闭3:当窗口到达10关闭时间后不会关闭,水位线到达13时触发关闭
两项同时作用时:
数据10到来,因为水位线乱序,所以此时实际水位线为10-2=8,相当于水位线数据到达了8
数据12到来,则水位线到达12-2=10,触发窗口计算输出,但此时水位线未到达13,窗口未关闭,这时迟到数据(以8为例)到来,因为数据值小于水位线(8-2<10),此时数据会放到0~10窗口,可以消费到迟到数据
当数据15到来,则水位线到达15-2=13,触发了窗口关闭,此时0~10窗口会关闭,无法消费迟到数据。
注意:0~10窗口,只会收集 [0 ,10)数据,后面12,15秒数据依旧会收集到 [10 , 20)窗口
思考:
如果 watermark等待2s,窗口允许迟到5s, 为什么不直接 watermark等待5s 或者 窗口允许迟到5s?
=》 watermark等待时间不会设太大 ===》 影响的计算延迟
如果2s ==》 窗口第一次触发计算和输出, 12s的数据来 。 12-2=10s
如果5s ==》 窗口第一次触发计算和输出, 15s的数据来 。 15-5=10s
=》 窗口允许迟到,是对大部分迟到数据的处理, 尽量让结果准确
如果只设置允许迟到5s, 那么 就会导致 频繁 重新输出
设置说明:
1、watermark等待时间,设置一个不算特别大的,一般是秒级,在 乱序和 延迟 取舍
2、设置一定的窗口允许迟到,只考虑大部分的迟到数据,极端小部分迟到很久的数据不管
3、极端小部分迟到很久的数据, 放到侧输出流。 获取到之后可以做各种处理