遇到的问题
按道理 窗口为4s,允许最大延迟是3s,那么当第一条数据01,1586489566000–2020-04-10 11:32:46进来后的窗口是 44s-48s。然后当01,1586489571000–2020-04-10 11:32:51 进来后,水印时间11:32:48>=48s的结束窗口,那么窗口应该结束,进行计算的。但是有时候测试并不会触发。
6.问题排查
后面断点调试发现代码有问题,在我们初始化水印时间的时候使用了private long maxTimeStamp = Long.MIN_VALUE; 当没数据来的时候,代码运行到这里给他赋值,然后他在减去允许迟到的时间,这时候该值就变成了 9223372036854772808 导致在emitWatermark 吧该值赋值给了currentWatermark,所以后面再来数据的的时候,数据的eventtime的水印时间都要比这个小,所以都不会触发窗口了。
所以就出现了当代码初始化还没运行到下面的的时候就来了数据的话,就能正常结束,当数据比代码运行到此处来的慢的时候就一直不会触发窗口结束。
7.问题解决
将
private long maxTimeStamp = Long.MIN_VALUE;
替换成
private long maxTimeStamp = 0l;