flink assignTimestampsAndWatermarks两种水印生成方式 源码分析

时间戳和水印的时间生成方式一般有一下两种方式

1、AscendingTimestampExtractor

在这里插入图片描述
在这里插入图片描述
由数据源码我们可以知道 AscendingTimestampExtractor抽象类实现了ssignerWithPeriodicWatermarks接口的extractTimestamp及getCurrentWatermark方法,同时声明抽象方法extractAscendingTimestamp供子类实现
AscendingTimestampExtractor生成代码的方式为:
extractAscendingTimestamp从每个元素element 提取newTimestamp,然后返回,对于违反时间单调性(timestamp monotony)的数据调用MonotonyViolationHandler进行处理,由跟读代码可知,他默认策略是对这种数据的处理策略为打印具体可以看
在这里插入图片描述
水印的生产策略为:getCurrentWatermark 方法在currentTimestamp不为Long.MIN_VALUE时返回Watermark(currentTimestamp - 1)

综上:
发现AscendingTimestampExtractor适用于elements的时间在每个并行task里面事单调递增的,(timestamp monotony)数据场景。

2、BoundedOutOfOrdernessTimestampExtractor

第二种是我们常用的方式,
应用例子为:
在这里插入图片描述
或者自己新建去实现
在这里插入图片描述
BoundedOutOfOrdernessTimestampExtractor 生成时间和水印的具体方式为:
在这里插入图片描述

BoundedOutOfOrdernessTimestampExtractor 抽象类实现AssignerWithPeriodicWatermarks接口的extractTimestamp及getCurrentWatermark方法,同时声明抽象方法extractAscendingTimestamp供子类实现
BoundedOutOfOrdernessTimestampExtractor 的构造器接受maxOutOfOrderness参数用于指定element允许之后(t-t_w,t为element的eventTime,t_w为前一次watermark的时间)的最大时间,在计算窗口数据时,如果超过该值则会被忽略。BoundedOutOfOrdernessTimestampExtractor的extractTimestamp方法会调用子类的extractTimestamp方法抽取时间,如果该时间大于currentMaxTimestamp,则更新currentMaxTimestamp;getCurrentWatermark先计算potentialWM,如果potentialWM大于等于lastEmittedWatermark则更新lastEmittedWatemakr(currentMaxTimestamp - lastEmittedWatermark >= maxOutOfOrderness,这里表示lastEmittedWatermark太小了所以差值超过了maxOutOfOrderness,因此会调大lastEmittedWatermark),最后返回watermark(拉萨特人)

具体逻辑参考:就是判断如果新的水印时间大于上次最后一次发出水印时间,选择新的水印时间,否则选择上次最后发送水印时间戳
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40809627/article/details/107642250