李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
大数据
正文
22.Flink之Watermark基本概念
Leefs
2022-01-23 PM
1580℃
0条
[TOC] ### 一、乱序数据的影响 我们知道,流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的,虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络、分布式等原因,导致乱序的产生,所谓乱序,就是指 Flink 接收到的事件的先后顺序不是严格按照事件的Event Time顺序排列的。 ![22.Flink之Watermark基本概念01.png](https://lilinchao.com/usr/uploads/2022/01/3755228013.png) 那么此时出现一个问题,一旦出现乱序,如果只根据eventTime决定window的运行,我们不能明确数据是否全部到位,但又不能无限期的等下去,此时必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了,这个特别的机制,就是**Watermark**。 **怎样避免乱序数据带来计算不正确?** 遇到一个时间戳达到了窗口关闭时间,不应该立刻触发窗口计算,而是等待一段时间,等迟到的数据来了再关闭窗口。 ### 二、水位线(Watermark) #### 2.1 概述 + Watermark 是一种衡量 Event Time 进展的机制,可以设定延迟触发; + Watermark 是用于处理乱序事件的,而正确的处理乱序事件,通常用 Watermark 机制结合 window 来实现; + 数据流中的 Watermark 用于表示 timestamp 小于 Watermark 的数据,都已经到达了,因此,window 的执行也是由 Watermark 触发的; + Watermark 用来让程序自己平衡延迟和结果正确性。 #### 2.2 触发条件 Watermark可以理解成一个延迟触发机制,我们可以设置 Watermark 的延时时长 t,每次系统会校验已经到达的数据中最大的 maxEventTime,然后认定eventTime小于maxEventTime - t 的所有数据都已经到达,**如果有窗口的停止时间等于maxEventTime – t,那么这个窗口被触发执行**。 + 有序流的 Watermarker 如下图所示:(Watermark 设置为 0) ![22.Flink之Watermark基本概念02.jpg](https://lilinchao.com/usr/uploads/2022/01/4219454709.jpg) + 乱序流的 Watermarker 如下图所示:(Watermark 设置为 2) ![22.Flink之Watermark基本概念03.jpg](https://lilinchao.com/usr/uploads/2022/01/1222902070.jpg) 当Flink 接收到数据时,会按照一定的规则去生成 Watermark,这条 Watermark 就等于当前所有到达数据中的`maxEventTime - 延迟时长`,也就是说,Watermark 是基于数据携带的时间戳生成的,一旦Watermark比当前未触发的窗口的停止时间要晚,那么就会触发相应窗口的执行。由于 event time 是由数据携带的,因此,如果运行过程中无法获取新的数据,那么没有被触发的窗口将永远都不被触发。 **说明** 上图中,我们设置的允许最大延迟到达时间为2s,所以时间戳为7s的事件对应的Watermark是 5s,时间戳为12s的事件的Watermark是 10s,如果我们的窗口1是1s~5s,窗口2是 6s~10s,那么时间戳为7s的事件到达时的Watermarker恰好触发窗口1,时间戳为12s的事件到达时的Watermark恰好触发窗口2。 Watermark 就是触发前一窗口的“关窗时间”,一旦触发关门那么以当前时刻 为准在窗口范围内的所有所有数据都会收入窗中。 只要没有达到水位那么不管现实中的时间推进了多久都不会触发关窗。 #### 2.3 watermark的特点 ![22.Flink之Watermark基本概念04.jpg](https://lilinchao.com/usr/uploads/2022/01/2316834091.jpg) - watermark 是一条特殊的数据记录; - watermark必须单调递增,以确保任务的事件时间时钟在向前推进,而不是在后退; - watermark与数据的时间戳相关。 ### 三、Watermark的传递 上游向下游传递的时候会把watermark广播出去,下游可能会接收到多个上游的watermark数据,会在内部建立一个分区watermark,以最小的数据作为最终的watermark。 比如上游有3个数据源,输出的watermark分别为4,3,5 那么在下游会把3个数据全部接收到,最终输出最小的为自己的watermark也就是3。 下面这个例子,有4个上游数据,watermark分为是4,7,6,6,分区数据watermark数据是2,4,3,6 ![22.Flink之Watermark基本概念05.jpg](https://lilinchao.com/usr/uploads/2022/01/2959680826.jpg) **说明** **图1**: 当上游第1,2,3个数据都没来的时候,所有分区数据最小的是2,所以输出当前事件时间为2; **图2**:上游第1个数据来了,也就是4数据把原来的2覆盖了,这时候数据变成了4,4,3,6 最小的数据变成3,所以输出当前事件时间为3; **图3**:上游第2个数据7来了,也就是7把原来的4覆盖了,这时候数据变成了4,7,3,6 最小的数据还是3,所以输出当前事件时间还是3; **图4**:第四张图:上游第3个数据6来了,也就是6把3给覆盖了,这时候数据变成了4,7,6,6 最小的数据变成了4,所以输出当前事件时间是4; 附参考文章链接: https://blog.csdn.net/oMaFei/article/details/110200402
标签:
Flink
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/1871.html
上一篇
21.Flink中的时间语义
下一篇
23.Flink之Watermark使用详解
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
二叉树
排序
Azkaban
Java阻塞队列
链表
MySQL
FileBeat
Kafka
机器学习
微服务
Hbase
Spring
SQL练习题
Elastisearch
查找
RSA加解密
Filter
NIO
Spark Streaming
JavaSE
正则表达式
nginx
Spark
Http
数学
Scala
并发编程
数据结构
LeetCode刷题
gorm
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭