Flink白话解析Watermark
一、摘要
如果想使用Flink,Flink的Watermark是很难绕过去的概念。本文帮大家梳理Watermark概念
二、Watermark疑问
1、Flink应用的常见需求是什么
如公司运营一个官网,想统计下过去一分钟有多少用户访问官网。
如果使用Flink开发,来一条数据则计算一条也是可以的。但是这样频繁计算是非常消耗资源的,如果想用Flink做一些复杂统计,会非常费资源。
需求中想看近一分钟的访客,这时候需要用到窗口来统计窗口内发生的事情,如统计窗口内的用户数。一分钟可以理解为Flink的窗口大小,在这一分钟统计有多少用户。
窗口的作用就是为了周期性获取数据,把传入的流数据根据时间切分成多个桶(buckets)
2、Flink使用窗口后,带来的问题
因为流式数据想要按照窗口做统计。因为网络延迟、乱序、消息积压、重试等原因可能导致客户端发送的某条数据延迟到达服务器。
如:客户端正常发送1-10,10条数据
发生乱序后服务端收到数据是:2,3,4,5,1,6,3,8,9,10,7
而处理乱序的数据,则需要用到Watermark、allowedLateness、sideOutPut技术
Watermark:为了防止数据乱序的处理机制
allowedLateness:将窗口再延迟一段时间,比如等2分钟延迟的数据,2分钟到的可以继续计算
sideOutputLateData:最后兜底操作,窗口真正关闭后,延迟数据再过来,则输出到侧输出流。侧输出流数据可以在单独处理或丢弃
数据处理流程总结:Windows--> Watermark--> allowedLateness--> sideOutputLateData
数据处理流程描述:用Windows把流数据分块处理,用Watermark确定什么时候不再等待更早的数据/触发窗口进行计算,用allowLateNess 将窗口关闭时间再延迟一段时间。用sideOutPut 最后兜底把数据导出到其他地方。
3、Watermark翻译中文应该叫啥
网络上有把Watermark叫成水印有的叫水位线,翻译平台直接翻译是水印。名字按理来说可以反应本质,而我怎么也理解不了水印本质。
按照Watermark功能应该翻译成水位线,high water mark确实可以翻译成高水位线。海水或洪水所达到的最高水位,在Flink中到达水位线(Watermark)后触发计算。
4、Watermark代码中本质是什么
Watermark本质是上是一个时间戳,一般是事件发生时间。Watermark到达后触发计算
5、Watermark如何解决问题
可以把Watermark理解为一个水位线,这个Watermark不断变化,实际上作为数据的一部分随着数据流在流动。
定义了数据延迟多久就不再等待,当Flink中的运算符接收到Watermarks时,它认为早于该时间的消息已经完全抵达计算引擎,不再等待延迟的数据。
假设一个应用是触发窗口计算的逻辑,只有水位线越过窗口对应的结束时间,窗口才会关闭并触发计算,计算该窗口内的数据。
三、窗口相关概念
详细介绍参考:https://www.cnblogs.com/robots2/p/16063157.html
1、窗口分类
翻滚窗口(Tumbling Window,无重叠)
滚动窗口(Sliding Window,有重叠)
和会话窗口,(Session Window,活动间隙)
2、窗口生命周期
窗口有个开始结束时间,比如一个窗口大小10分钟,时间区间12:00-12.10分。
客户端生产了一条12:00点的数据,则这条数据到达服务器,就会创建一个窗口。
客户端生产了一条12:11分的数据,则这条数据到达服务器,如没指定延迟时间,则这个窗口就会关闭删除。
四、Flink时间相关概念简介
Flink分了三种时间类型
1、事件时间:是客户端真实发生该事件的时间,比如用户访问官网时的真实时间,一般为时间戳表示。
2、处理时间:数据发送给服务端后,进入Flink程序时的时间,也就是Flink程序读取到该条数据的时间。
3、提取时间:Flink程序中有一个或多个算子(方法),提取时间就是该条数据进入该算子的时间。如一个程序需要过滤、分组、聚合、输出,则该时间是某一个算子处理该条数据的时间
参考文章:https://www.cnblogs.com/rossiXYZ/p/12286407.html