水位线的概念理解及工作原理:
watermark是用于处理由于网络、背压等原因产生的乱序事件,窗口结束时间+延迟时间=最大waterMark值,即当waterMark值大于的上述计算出的最大waterMark值,该窗口内的数据就属于迟到的数据,无法参与window计算;代码中生成水位线的时间(即调用assignTimestampsAndWatermarks(WatermarkStrategy<T>watermarkStrategy)方法的时间)可为source之后,也可为使用算子之后,。
真实的项目中不光要考虑延迟时间,还要考虑长时间无数据无法触发计算的情况。
生成水位线的源码解析(flink1.11版本之后):
WatermarkStrategy接口继承了接口TimestampAssignerSupplier<T>以及接口WatermarkGeneratorSupplier<T>。其中TimestampAssignerSupplier<T>中的一个方法createTimestampAssigner(Context context) 返回一个TimestampAssigner对象,这个对象中有一个longextractTimestamp方法,作用是从Flink消费的记录中抽取时间,既可以理解为我们如果要通过业务时间进行统计时,需要通过该方法来提取记录的业务时间。所以用到业务时间的话,一定要根据自己的业务场景对该方法进行具体的实现。否则Flink会提供一个默认的实现RecordTimestampAssigner<>()(默认直接返回记录里边的时间)。
其中继承自WatermarkGeneratorSupplier<T&