水印生成的周期
默认的生成周期是200毫秒,我们可以在环境中修改这个时间
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
// TODO: 改变水印生成的周期
env.getConfig.setAutoWatermarkInterval(200L)
-
1
-
2
-
3
可以在这个类中找到代码 StreamExecutionEnvironment
我们可以看到ProcessingTime的生成水印的间隔是0
EventTime和IngestionTime默认生成水印间隔为200ms
public void setStreamTimeCharacteristic(TimeCharacteristic characteristic) {
this.timeCharacteristic = Preconditions.checkNotNull(characteristic);
if (characteristic == TimeCharacteristic.ProcessingTime) {
getConfig().setAutoWatermarkInterval(0);
} else {
getConfig().setAutoWatermarkInterval(200);
}
}
水印的生成的过程
- 有周期生成指定延迟的水印
- 针对每条数据判断条件当条件符合生成指定延迟的生成水印
AssignerWithPeriodicWatermarks生成水印方式的调用方式
1
- 2
- 3
从executionConfi中获取watermarkInterval ,大于0时会注册定时器,ProcessingTime 的watermarkInterval 为0 所以不会创建水印,在now + watermarkInterval后会触发定时器
- 4
抽象类,我们看一下他的实现
SystemProcessingTimeService
会起一个TriggerTask线程放入timerService线程池中等待调度。
TriggerTask是一个内部类的run方法会回调TimestampsAndPeriodicWatermarksOperator的onProcessingTime方法
这里会先调udf(这里就是我们定义的AssignerWithPeriodicWatermarks生成水印方式)中的getCurrentWatermark获取水印,和当前水印时间判断是否需要发送新的水印,最后再次注册定时器
这样产生了一个循环,就会周期性生成水印了。
AssignerWithPunctuatedWatermarks生成水印方式的调用方式
直到这里可以看到处理流中每个元素的方法,先抽取时间戳,再判断执行生成水印的逻辑
这个逻辑 事件id=“sensor_1” 的事件才会生成水印 水印的延迟是1分钟