flink的MaxOutOfOrderness 和 Allowedlateness 区别

这篇具有很好参考价值的文章主要介绍了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
 文章来源地址https://www.toymoban.com/news/detail-855009.html

到了这里,关于flink的MaxOutOfOrderness 和 Allowedlateness 区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flink cdc 、 canal 、maxwell 的区别

    目录 读取数据的格式不同   (CDC是自定义的数据类型  在这里就不进行展示了,主要是展示一下Maxwell和Canal的区别) 1.添加的区别         1.1 Canal 1.2 Maxwell 2.修改的区别 2.1Canal 2,2Maxwell 3.删除的区别 3.1 Canal 3.2 Maxwell Flink CDC :         DataStream:                 优点:多库多

    2023年04月17日
    浏览(41)
  • flink的window和windowAll的区别

    在flink的窗口函数运用中,window和windowAll方法总是会引起混淆,特别是结合上GlobalWindow的组合时,更是如此,本文就来梳理下他们的区别和常见用法 window是KeyStream数据流的方法,其并行度是任意的,也就是最大可以和分组key的数量相同 windowAll是DataStream数据流的方法,其并行

    2024年01月25日
    浏览(39)
  • Hadoop、Spark、Storm、Flink区别及选择

    hadoop和spark是更偏向于对大量离线数据进行批量计算,提高计算速度 storm和flink适用于实时在线数据,即针对源源不断产生的数据进行实时处理。至于storm和flink之间的区别在于flink的实时性和吞吐量等要比storm高。 上述四个组件的实时性高低顺序如下: hadoop spark storm flink hdf

    2024年02月08日
    浏览(42)
  • Flink stop 和 cancel停止 job 的区别

    后边跟的任务id 是flink的任务ID,不是yarn的 注:stop方式停止任务对 source 有要求,source必须实现了StopableFunction接口,才可以优雅的停止job 取消任务。如果在 conf/flink-conf.yaml 里面配置了 state.savepoints.dir ,会保存savepoint, 否则不会保存 savepoint。 使用 命令方式 也可以在停止的

    2024年02月07日
    浏览(42)
  • Flink中max和maxBy的区别及使用

    在Flink中 max 算子和 maxBy 算子都是用来求取最大值的,下面将结合代码介绍一下它俩的相同点和不同点 相同点 都是滚动聚合 都会根据代码的逻辑更新状态中记录的聚合值,并输出 不同点 max 算子只会更新最大值的字段, maxBy 算子会更新整条数据,下面就结合代码看和结果看一下相

    2024年02月11日
    浏览(26)
  • Flink与Spark Streaming在与kafka结合的区别!

    首先,我们先看下图,这是一张生产消息到kafka,从kafka消费消息的结构图。 当然, 这张图很简单,拿这张图的目的是从中可以得到的跟本节文章有关的消息,有以下两个: 1,kafka中的消息不是kafka主动去拉去的,而必须有生产者往kafka写消息。 2,kafka是不会主动往消费者发

    2024年04月17日
    浏览(50)
  • Flink stop 和 cancel停止 job 的区别 Flink 停止 job 的方式(stop 和 cancel)

    后边跟的任务id 是flink的任务ID,不是yarn的 注:stop方式停止任务对 source 有要求,source必须实现了StopableFunction接口,才可以优雅的停止job 取消任务。如果在 conf/flink-conf.yaml 里面配置了 state.savepoints.dir ,会保存savepoint, 否则不会保存 savepoint。 使用 命令方式 也可以在停止的

    2024年02月12日
    浏览(46)
  • 07-Flink的keyby怎么实现的分区?分区、分组的区别是什么?

    Keyby实现原理: 对指定的key调用自身的hashCode方法=》hash1 调用murmruhash算法,进行第二次hash =》键组ID 通过一个公式,计算出当前数据应该去往哪个下游分区: 键组id * 下游算子并行度 / 最大并行度(默认128) 分区:算子的一个并行实例可以理解成一个分区,是物理上的资源

    2024年02月11日
    浏览(37)
  • flink checkpoint时exact-one模式和atleastone模式的区别

    flink在开启checkpoint的时候有两种模式可以选择,exact-one和atleastone模式,那么这两种模式有什么区别呢? 先说结论:exact-one可以完全做到状态的一致性,而atleastone模式正常情况下没法做到状态的一致性,如果开启这个模式,有些消息会重复处理,例如统计计数时,重复的消息

    2024年02月11日
    浏览(38)
  • 为什么说新一代流处理器Flink是第三代流处理器(论点:发展历史、区别、适用场景)

           Flink 被认为是第三代流处理器,这是因为 Flink 在设计时参考了前两代流处理器的经验教训并引入了一些新的技术和思想,从而使得 Flink 具有更高的性能和更广泛的应用场景。下面我带大家了解一下流处理器从第一代到第三代的发展历史。        对于有状态的流

    2024年02月03日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包