我们先梳理一下time和timewindows的联系和区别:
触发器:
自定义触发器:
如果滑动窗口则触发器,则需要定义驱除器Evictort:
驱除器的逻辑:
滚动窗口join
滑动窗口join
会话窗口join,每隔1S GAP隔离窗口:
范围join
1、time 是一个时间的类型,不同处理情况下的时间。如:进入时间、事件时间、执行时间。
2、timewindows是一个时间的使用策略,比如多久上述时间多久间隔执行一次。分为滚动窗口、滑动窗口、会话窗口。
工作中常用Event Time 计算。
滑动窗口案例以下需求:
模拟测试的数据源,10S的整数倍执行,也就是模拟了一个10秒滚动窗口:
运行结果:
但上述案例是正常情况下,但是有一种情况数据源的数据顺序延迟的情况,出现情况【发送12数据,数据1到kafka分区1,数据2到kafka分区2,如果分区2卡了,数据顺序21】:
模拟乱序的代码:
运行结果,不是我们想要的顺序:
结果分析:
怎么解决??????waterMark给每个窗口增加延迟时间。主要解决kafka分区延迟造成的乱序问题,这个值设置一般是kafka分区的延迟。
举例如何使用WaterMark:
运行结果,使用WaterMark正常了:
但超过延迟时间默认丢弃,设置延迟归集sideOutput策略如下:
计算函数sumProcessWindowFunction
以上增加并行度的案例,观察线程的情况:
运行结果: