暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Flink源码解读系列 | Periodic水印和Punctuated水印实现原理

暴走大数据 2020-09-07
937

点击上方蓝色字体,选择“设为星标”

回复”资源“获取更多惊喜


大数据技术与架构
点击右侧关注,大数据开发领域最强公众号!

暴走大数据
点击右侧关注,暴走大数据!


在用户代码中,我们设置生成水印和事件时间的方法assignTimestampsAndWatermarks()中这里有个方法的重载
我们传入的对象分为两种
AssignerWithPunctuatedWatermarks(可以理解为每条数据都会产生水印,如果不想产生水印,返回一个null的水印)
AssignerWithPeriodicWatermarks(周期性的生成水印)
来看一下源码中是如何实现这两种水印的
二话不说打开org.apache.flink.streaming.runtime.operators.TimestampsAndPunctuatedWatermarksOperator.java
这个类的processElement方法
 
看到源码这里这段逻辑就 非常的清晰了
先通过用户的代码获取到事件时间,注入到element里面就直接往下个opeartor发送了
然后通过用户代码获取水印,这里会判断水印是否为null
不为null的就直接往下游emit 了
现在看一下AssignerWithPeriodicWatermarks如何周期的发送生成的水印
直接打开TimestampsAndPeriodicWatermarksOperator.java这个类
这里先不看processElement()方法,先看open方法
 
可以看到它将  当前时间其实就是System.currentTimeMillis()+ watermarkInterval水印间隔 注册作为了一个timer定时器
这样就知道了,当他过了这个水印间隔时间以后肯定会触发操作
来看一下这个间隔时间以后触发了什么操作
 
可以看到,他先是获取了当前的水印时间,然后直接emit出去了????
Periodic模式明明是在接收数据的processElement()发送水印的
然后又再次注册了一个 当前时间+间隔的 timer,这样就无限的触发下去了
既然他在这里发送了水印,来看下他的processElement方法
 
果然他周期性的发送水印以后,接收数据的processElement()方法里面就没有发送水印了
只有获取事件时间的逻辑了。

版权声明:

本文为《暴走大数据》整理,原作者独家授权。未经原作者允许转载追究侵权责任。
编辑|冷眼丶
微信公众号|暴走大数据

欢迎点赞+收藏
欢迎转发至朋友圈

文章不错?点个【在看】吧! 👇


文章转载自暴走大数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论