小本本介绍
大家好,我是本际云服务器推荐网的小编小本本,今天为大家带来一篇关于Flink源码分析的文章。

Flink源码分析-生成水印(Watermark)
之前项目一直用的是Flink-1.7.2版本,现在扫描漏洞的时候必须升级到Flink-1.12.0或Flink-1.11.3,所以我们直接升级到了Flink-1.12.0版本,但发现之前用的api(assignTimestampsAndWatermarks)已被设置为废弃。新版本的Flink在类classDataStream中提供了一个新的构造水印assignTimestampsAndWatermarks方法,新的接口需要传入一个WatermarkStrategy对象。
WatermarkStrategy接口继承了接口TimestampAssignerSupplier以及接口WatermarkGeneratorSupplier,上面两个接口都是支持函数式编程的。
先看一下interfaceTimestampAssignerSupplier这个接口提供的方法,是创建一个TimestampAssigner类型的方法。那这个TimestampAssigner在水印生成过程中起到什么作用了?这个接口的定义有一个long extractTimestamp方法,作用是从Flink消费的记录中抽取时间,既可以理解为我们如果要通过业务时间进行统计时,需要通过该方法对来提取记录的业务时间。如果要用到业务时间,需要根据自己的业务场景对该方法进行具体的实现。
接下来看interfaceWatermarkGeneratorSupplier这个接口,是返回一个WatermarkGenerator类型的方法。提供了两个水印发送的方式:
- onEvent:每条记录进来都会调用一次这个方法,入参有3个,第一个是记录,第二个是记录携带的时间,如果注册了时间就会有,第三个参数时水印发射器WatermarkOutputoutput,可以通过这个参数对水印进行发射。该方法的重点是每条记录都会调用。
- onPeriodicEmit: 该方法是Flink提供的一个定时器方法,每隔一段时间会调用此方法,入参是WatermarkOutputoutput,用户可以通过这个方法每隔一段时间发送一次水印,此时可以通过这个方法进行水印的定时发送,而onEvent只记录当前水印而选择不发射出去。
而WatermarkStrategy中也提供了一些常用的WatermarkGenerator供用户使用,比如BoundedOutOfOrdernessWatermarks类中就是一个在onEvent中记录水印,通过onPeriodicEmit方法定时向下游发送水印的实现,构造参数maxOutOfOrderness是提供给记录乱序的,运行最大延迟间隔,而MaxTimestamp是当前的水印记录。
最后结合项目的需求将原来的使用水印的地方改成了新版本中的实现,配合类图及FLINK水印算子简要流程进行说明。
参考资料
- https://zhuanlan.zhihu.com/p/158951593
- https://blog.csdn.net/zhaoyuqiang/article/details/107453466
结束。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/5946.html
