flink assign watermark源码分析

水印生成的周期

默认的生成周期是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分钟
在这里插入图片描述

发布了48 篇原创文章 · 获赞 5 · 访问量 1158

猜你喜欢

转载自blog.csdn.net/qq_34897849/article/details/103914261