flink的MaxOutOfOrderness 和 Allowedlateness 区别

2024-03-24 23:04

本文主要是介绍flink的MaxOutOfOrderness 和 Allowedlateness 区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MaxOutOfOrderness 和 Allowedlateness 都是为了对乱序数据进行处理,但是经常会混淆着两个概念,需要进行一些区分。

MaxOutOfOrderness

source.map(...//省略不必要代码)

      // 定义 watermark

      .assignTimestampsAndWatermarks(

            // 设置 watermark 比 事件时间晚 1s

            WatermarkStrategy.<ApacheLogEvent>forBoundedOutOfOrderness(Duration.ofSeconds(1))

            // 定义 watermark 生成规则

            .withTimestampAssigner(...//省略不必要代码));

定义 watermark 的时候可以设置生成 watermark 的时间比事件时间延迟多久,即 eventTime + maxoutoforderness

为什么说设置了 maxoutoforderness就可以减轻乱序?因为我们统计数据在哪个窗口,是按照 Event time 收入窗口的,而不是按照eventTime + maxoutoforderness或者eventTime - maxoutoforderness收入窗口的,所以如果你设置watermark 比 事件时间晚 2s,比如窗口本来是【0,5),数据A的event_time为4,那么哪怕这条数据慢了2s过来(即到了event_time=6s才到),6s的另一条准时数据B的event_time=6,他会把当前watermark推进到event_time-2s=4s,没有大于end_of_window=5,因此还不会触发窗口计算;所以B这条迟到数据在event_time=6s时才过来,就还能参与到后面的窗口计算;

而如果你设置的  maxoutoforderness=0s,那么这条数据慢了2s过来(即到了event_time=6s才到),5s的另一条准时数据C会把watermark推进到也是event_time-0s=5s>=end_of_window,马上就会触发窗口计算,此时如果没有配置allowlateness,则6s时才来的迟到数据A是无法参与对应的窗口计算的。

Allowedlateness

dataStream.keyBy(...//省略不重要的代码)

    .timeWindow(Time.minutes(10), Time.seconds(5))

    // 定义窗口关闭的延迟时间

    .allowedLateness(Time.minutes(1))

默认情况下, 如果不指定 AllowedLateness, 其值是 0, 即当 Watermark 通过 end-of-window 之后, 再有归属于该window的数据到达时, 这些数据会被删除. 

为了避免有些迟到的数据被删除, 因此产生了 AllowedLateness 的概念.,使用allowedLateness延迟销毁窗口,使得Watermark 超过 end-of-window 之后,允许有一段时间(也是以event time来衡量)来等待之前的数据到达,以便再次处理这些数据。

窗口watermark和allowedLateness之后依然迟到的流数据,也是通过.sideOutputLateData(outputTag)和result.getSideOutput(outputTag)的侧输出流方式输出的,拿到这一部分数据后用户可以自己处理,相比于spark的水印和数据延迟机制来说,flink的更加完善和易用

allowedLateness只针对eventTime,因为processingTime不存在延时的情况。。

区别说明

假设我们有一个数据流,其中包含不同时间的事件,我们想要计算每个用户过去一小时内的点击次数。我们使用事件时间来处理这些数据。

MaxOutOfOrderness

假设当前时间是13:00,我们正在处理一个时间范围为12:00至13:00的时间窗口。如果我们设置`maxOutOfOrderness`为5分钟,那么系统会等待直到13:05,以确保所有在12:00至13:00时间范围内实际发生但延迟到达的事件都能被包括在这个窗口的计算中。   例如,我们有一个用户在12:50点击了页面,但是由于某种原因,这个点击事件直到13:03才到达Flink系统。由于我们设置了5分钟的`maxOutOfOrderness`,这个事件仍然会被包括在12:00至13:00时间窗口的计算中。

这里注意:我们一般只会让水位线比事件时间慢,而事件时间是不会超越当前时间的(除非异常数据,所以13:05的水位线一定小于等于13:05),所以配置maxOutOfOrderness才能让水位线上升慢一点来等乱序落后的数据,不至于按正常的事件时间来准时触发窗口计算。

AllowedLateness

继续上面的例子,假设我们设置了`allowedLateness`为2分钟。在13:05之后,系统认为12:00至13:00时间窗口的所有事件都已经到达,并触发计算。假设此时计算结果显示用户A在该窗口内点击了5次。   但是,由于某些原因,用户A在12:58的另一个点击事件直到13:07才到达。由于我们设置了2分钟的`allowedLateness`,系统会重新触发12:00至13:00时间窗口的计算,并将这个迟到的事件包括在内。新的计算结果会显示用户A在该窗口内点击了6次,并且这个新的结果会被发射出去。

总结一下,`maxOutOfOrderness`和`allowedLateness`都是为了处理乱序事件,但是它们在不同的阶段起作用。`maxOutOfOrderness`是在窗口触发之前等待迟到事件的机制,而`allowedLateness`是在窗口触发之后保持窗口开放一段时间以处理迟到事件的机制。通过合理设置这两个参数,我们可以更准确地处理乱序事件。

具体例子

可以看这个例子,讲得很清楚:

flink-learning/AllowedLateness.md at main · agoclover/flink-learning · GitHub
 

这篇关于flink的MaxOutOfOrderness 和 Allowedlateness 区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/843071

相关文章

关于Mybatis和JDBC的使用及区别

《关于Mybatis和JDBC的使用及区别》:本文主要介绍关于Mybatis和JDBC的使用及区别,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、JDBC1.1、流程1.2、优缺点2、MyBATis2.1、执行流程2.2、使用2.3、实现方式1、XML配置文件

exfat和ntfs哪个好? U盘格式化选择NTFS与exFAT的详细区别对比

《exfat和ntfs哪个好?U盘格式化选择NTFS与exFAT的详细区别对比》exFAT和NTFS是两种常见的文件系统,它们各自具有独特的优势和适用场景,以下是关于exFAT和NTFS的详细对比... 无论你是刚入手了内置 SSD 还是便携式移动硬盘或 U 盘,都需要先将它格式化成电脑或设备能够识别的「文

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

分辨率三兄弟LPI、DPI 和 PPI有什么区别? 搞清分辨率的那些事儿

《分辨率三兄弟LPI、DPI和PPI有什么区别?搞清分辨率的那些事儿》分辨率这个东西,真的是让人又爱又恨,为了搞清楚它,我可是翻阅了不少资料,最后发现“小7的背包”的解释最让我茅塞顿开,于是,我... 在谈到分辨率时,我们经常会遇到三个相似的缩写:PPI、DPI 和 LPI。虽然它们看起来差不多,但实际应用