Flink之watermark(水印)讲解

flink中watermark的详细介绍

使用前提:

处理数据开窗,处理数据的时间语义是事件时间,也就是每条数据产生的时间。

使用场景(解决问题):

处理乱序数据:flink中是实时处理数据,但是在处理数据的时候会出现因为网络传输的问题,所以数据先产生的反而到后面才到达,在被处理时候就会出现数据混乱,而且因为开窗,窗口关闭但是本窗口的数据来迟,导致数据丢失;

理想转态,数据按照顺序到达

理想状态

则对应窗口可以获得的数据就是
在这里插入图片描述
每一个窗口都可以得到对应的数据
但实际数据到来的顺序可能会出现乱序:
在这里插入图片描述

则没有watermark会每个窗口数据会出现的情况:

在这里插入图片描述

可以看到第一个来的4这个数据会导致[0,3)窗口关闭,而后来的数据1,2都无法在进入这个窗口中,也就导致了数据丢失,同样的道理6号数据,会导致[3,6)窗口关闭,3,5数据丢失

问题解决:

通过watermark来解决,简单来说就是延迟窗口关闭的时间,等一会迟到的数据,窗口关闭不在依据数据的时间,而是到达的watermark的时间。
看数据知道最大的乱序时间是4s(假设每个编号代表数据本省产生的时间),所以可以将窗口延迟等待的时间设置为4s;
在这里插入图片描述

watermark的生成就是每来一条数据生成一次,但是生成的计算公式是到最新到达的一条数据时间为止,数据最大的时间-4,当前已经到达的数据的最大时间,也就是说watermark的生成是只能不断变大,或者不变,而不可能减小的。(这里为方便没有再减一,实际代码运行时会在-1的) watermark= maxTimestamp - outOfOrdernessMillis -1

所以生成的watermark依次为:
在这里插入图片描述

这样就是4数据到来后,产生watermark为0,1数据到来后产生的watermark还是0,因为到1号数据为止最大的时间是4,依次类推就如上图。
因为现在窗口关闭是依据watermark的时间,而不是数据本身时间了,所以4号数据到达[3,6)窗口时,产生的watermark为0不会导致[0,3)窗口关闭,只有等到watermark为3才会关闭,也就是等到7号数据到达产生3的watermark的时候,所以每个窗口的数据就为:
在这里插入图片描述

所有的数据都可以到原本的窗口。

多平行度下的watermark

一个子任务中watermark会发往所有下一算子中的子任务,也就是一发多,
同样一个子任务会接收上一个算子中所有子任务的watermark,这时起作用的就是最小的哪一个watermark。
watermark可以理解为一个特殊的数据,这个数据不参与计算,仅仅是对窗口的触发关闭起作用;

总结:

1)衡量事件时间的进展
2) 单调不减的(保持不变,或 增加)
3) 是一个特殊时间戳,生成之后插入到流里,随着流的流动传递
4)解决 乱序 的问题
5)认为,在它之前的数据都处理过了(如果还有,说明该数据迟到了)
6)触发 窗口等 的 计算、关闭1

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FlinkWatermark是一种用于衡量Event Time进展的机制。它用于处理实时数据的乱序问题,并常与窗口结合使用来实现事件的有序处理。Watermark可以被理解为一种时间戳标记,表示在该标记之前的事件都已经到达,因此可以触发窗口计算。Watermark的生成可以通过实现WatermarkGenerator接口来实现,该接口包含了onEvent和onPeriodicEmit两个方法来生成Watermark。在onEvent方法,可以观察流事件数据,并在获取到带有Watermark信息的特殊事件元素时发出Watermark。而在onPeriodicEmit方法,可以根据需要周期性地发出Watermark。同时,在Flink,还可以通过WatermarkStrategy接口来定义Watermark的生成策略,该接口包含了createTimestampAssigner方法用于实例化一个可分配的时间戳生成器,以及createWatermarkGenerator方法用于实例化一个Watermark生成器。总之,WatermarkFlink起到了衡量事件时间进展和触发窗口计算的重要作用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Flink:Watermark](https://blog.csdn.net/qq_24325581/article/details/117515189)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [1分钟理解FlinkWatermark机制](https://blog.csdn.net/m0_68470434/article/details/126742410)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值