Flink水印不能触发窗口计算问题详解

遇到的问题

按道理 窗口为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的水印时间都要比这个小,所以都不会触发窗口了。

所以就出现了当代码初始化还没运行到下面的的时候就来了数据的话,就能正常结束,当数据比代码运行到此处来的慢的时候就一直不会触发窗口结束。

image.png
image.png

7.问题解决

将 
private long maxTimeStamp = Long.MIN_VALUE;
替换成
private long maxTimeStamp = 0l;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容