数据乱序的产生
flink对数据进行流处理时,大部分情况下流到operator的数据都是按照事件产生的时间顺序来的 。但是也不排除由于网络抖动、背压等原因,导致乱序的产生,所谓乱序,就是指Flink接收到的事件的先后顺序不是严格按照事件的Event Time顺序排列的 。
如下图场景:
文章插图
使用时间窗口来统计10分钟内的用户流量
时间窗口:2017-03-19 10:00:00-2017-03-19 10:10:00
数据59,因为网络延迟,其eventTime为2017-03-19 10:09:00,processingTime为2017-03-19 10:10:02 。
此时,按照事件时间来计算,假设有另外一条数据(eventTime为2017-03-19 10:10:00)在2017-03-19 10:10:01时刻进入这个窗口,则会导致窗口关闭 。因为59在2017-03-19 10:10:02才到达,因为属于59的窗口被提前关闭了,则59就会被遗漏,导致数据统计不准确 。
事件时间窗口:按照进入数据的事件时间来判断是否关闭窗口,如果进来一条新数据是下一个窗口的数据,那么会关闭上一个窗口 。
使用水印解决乱序问题
1、水印(watermark)就是一个时间戳 。
2、Flink可以给数据流添加水印,可以理解为:收到一条消息后,额外给这个消息添加了一个时间字段,这就是添加水印,一般人为添加的消息的水印都会比当前消息的事件时间晚一些 。
3、窗口是否关闭按照水印时间来判断,但原有事件时间不会被修改,窗口的边界依旧是事件时间来决定 。
(1)水印并不会影响原有Eventtime
(2)当数据流添加水印后,会按照水印时间来触发窗口计算
(3)一般会设置水印时间,比Eventtime晚一些(一般几秒钟)
(4)当接收到的水印时间 >= 窗口的endTime且窗口内有数据,则触发计算
水印(水印时间)的计算: 事件时间 – 设置的水印长度 = 水印时间
比如,事件时间是10分30秒, 水印长度是2秒,那么水印时间就是10分28秒
水印实现延迟等待功能的原理分析
举例:
窗口5秒,延迟(水印)3秒,按照事件时间计算
1. 数据事件时间3, 落入窗口0-5.水印时间0
2. 来一条数据事件时间7, 落入窗口5-10,水印时间4
3. 来一条数据事件时间4,落入窗口0-5,水印时间1
4. 来一条数据事件时间8,落入窗口5-10,水印时间5
这一条数据水印时间大于等于 窗口0-5的窗口结束时间 。
满足了对窗口0-5的提交,这个窗口关闭,并触发数据计算
可以看出,第三条数据,其是延迟数据,它的事件时间是4,却来的比事件时间为7的数据还要晚 。
但是因为水印的机制,这个数据未错过它的窗口,依旧成功进入属于它的窗口并且被计算
这就是水印的功能:在不影响按照事件时间判断数据属于哪个窗口的前提下,延迟某个窗口的关闭时间,让其等待一会儿延迟数据 。
flink水印的代码实现
【好看的水印素材 适合做水印的英文】
文章插图
- 手机处理器排行榜前十名 最好的手机处理器排名2022
- 什么净水器好 什么样的净水机比较好一点
- 艾绒敷肚脐的功效 坐灸仪的熏屁股的好处
- 摩托罗拉哪款机子最好 摩托罗拉手机老款图片
- 怎么定位找到一个人的位置 微信好友定位精确定位
- 十大螺蛳粉品牌排行榜 螺狮粉什么品牌正宗最好吃
- 最干净的杀毒软件免费 电脑用哪个杀毒软件最好用
- 什么聊天软件好 免费聊天靠谱的软件
- 什么感冒药好 怎样辨别风寒和风热感冒
- iPhone12到底值得买吗 苹果12怎么样好不好用