Flink对迟到数据的处理

这篇具有很好参考价值的文章主要介绍了Flink对迟到数据的处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Apache Flink 是一个分布式流处理框架,可以通过多种方式处理延迟数据。这里有几个选项:

🍊水位线WaterMarker:Flink 使用水位线来跟踪流中的时间进度。水位线是由源发出的周期性时间戳,用于确定一条数据的延迟时间。您可以根据水位线指定数据的最大延迟。例如,您可以指定延迟超过 10 个水位线的数据应该被删除。

🍊窗口延迟数据:Flink 允许为预计在窗口内无序到达的数据指定最大延迟(延迟)。allowedLateness可以在定义窗口时使用参数设置此最大延迟。任何在最大延迟时间之后到达的数据都将被丢弃。

🍊侧输入流:Flink 还允许您使用侧输入来处理延迟数据。辅助输入是除了主输入流之外还使用的数据集。您可以使用辅助输入来存储键的最新已知值,然后在迟到的数据到达时使用该值更新主输入流。Output Mode:Flink 还允许您指定在使用带参数的窗口时应处理多晚的数据OutputMode。您可以选择仅输出延迟数据、仅输出更新数据或同时输出延迟数据和更新数据。

1、设置水位线延迟时间

       水位线是事件时间的进展,它是我们整个应用的全局逻辑时钟。水位线生成之后,会随着数据在任务间流动,从而给每个任务指明当前的事件时间。所以从这个意义上讲,水位线是一个覆盖万物的存在,它并不只针对事件时间窗口有效。之前我们讲到触发器时曾提到过“定时器”,时间窗口的操作底层就是靠定时器来控制触发的。既然是底层机制,定时器自然就不可能是窗口的专利了;事实上它是 Flink 底层 API— —处理函数(process function)的重要部分。

       所以水位线其实是所有事件时间定时器触发的判断标准。那么水位线的延迟,当然也就是全局时钟的滞后,相当于是上帝拨动了琴弦,所有人的表都变慢了。既然水位线这么重要,那一般情况就不应该把它的延迟设置得太大,否则流处理的实时性就会大大降低。因为水位线的延迟主要是用来对付分布式网络传输导致的数据乱序,而网络传输的乱序程度一般并不会很大,大多集中在几毫秒至几百毫秒。所以实际应用中,我们往往会给水位线设置一个“能够处理大多数乱序数据的小延迟”,视需求一般设在毫秒~秒级。当我们设置了水位线延迟时间后,所有定时器就都会按照延迟后的水位线来触发。如果一个数据所包含的时间戳,小于当前的水位线,那么它就是所谓的“迟到数据”。

~代码示例

// Define a window with a maximum lateness of 5 seconds
Window<Tuple2<String, Integer>> window = Window.into(TumblingEventTimeWindows.of(Time.seconds(5)))
    .allowedLateness(Time.seconds(5));

2、允许窗口处理迟到数据

       水位线延迟设置的比较小,那之后如果仍有数据迟到该怎么办?对于窗口计算而言,如果水位线已经到了窗口结束时间,默认窗口就会关闭,那么之后再来的数据就要被丢弃了。自然想到,Flink 的窗口也是可以设置延迟时间,允许继续处理迟到数据的。这种情况下,由于大部分乱序数据已经被水位线的延迟等到了,所以往往迟到的数据不会太多。这样,我们会在水位线到达窗口结束时间时,先快速地输出一个近似正确的计算结果;然后保持窗口继续等到延迟数据,每来一条数据,窗口就会再次计算,并将更新后的结果输出。这样就可以逐步修正计算结果,最终得到准确的统计值了。

       类比班车的例子,我们可以这样理解:大多数人是在发车时刻前后到达的,所以我们只要把表调慢,稍微等一会儿,绝大部分人就都上车了,这个把表调慢的时间就是水位线的延迟;到点之后,班车就准时出发了,不过可能还有该来的人没赶上。于是我们就先慢慢往前开,这段时间内,如果迟到的人抓点紧还是可以追上的;如果有人追上来了,就停车开门让他上来,然后车继续向前开。当然我们的车不能一直慢慢开,需要有一个时间限制,这就是窗口的允许延迟时间。一旦超过了这个时间,班车就不再停留,开上高速疾驰而去了。所以我们将水位线的延迟和窗口的允许延迟数据结合起来,最后的效果就是先快速实时地输出一个近似的结果,而后再不断调整,最终得到正确的计算结果。回想流处理的发展过程,这不就是著名的 Lambda 架构吗?原先需要两套独立的系统来同时保证实时性和结果的最终正确性,如今 Flink 一套系统就全部搞定了。

~代码示例

// Define a watermark strategy that drops data more than 10 watermarks late
BoundedOutOfOrdernessTimestampExtractor<Tuple2<String, Integer>> watermarkStrategy =
	//有界无序时间戳提取器,设置 watermark 延迟时间,10 秒钟
    new BoundedOutOfOrdernessTimestampExtractor<Tuple2<String, Integer>>(Time.seconds(10)) {
      @Override
      public long extractTimestamp(Tuple2<String, Integer> element) {
        // extract the timestamp from the element
        return element.f0;
      }
    };

// Assign the watermark strategy to the input stream
DataStream<Tuple2<String, Integer>> watermarkedStream = inputStream.assignTimestampsAndWatermarks(watermarkStrategy);

// Process the watermarked stream
watermarkedStream.process(new ProcessFunction<Tuple2<String, Integer>, String>() {
  @Override
  public void processElement(Tuple2<String, Integer> value, Context ctx, Collector<String> out) {
    // data with a timestamp more than 10 watermarks in the past will not be processed
  }
});

3、将迟到数据放入窗口侧输出流

       即使我们有了前面的双重保证,可窗口不能一直等下去,最后总要真正关闭。窗口一旦关闭,后续的数据就都要被丢弃了。那如果真的还有漏网之鱼又该怎么办呢?

       用窗口的侧输出流来收集关窗以后的迟到数据。这种方式是最后“兜底”的方法,只能保证数据不丢失;因为窗口已经真正关闭,所以是无法基于之前窗口的结果直接做更新的。我们只能将之前的窗口计算结果保存下来,然后获取侧输出流中的迟到数据,判断数据所属的窗口,手动对结果进行合并更新。尽管有些烦琐,实时性也不够强,但能够保证最终结果一定是正确的。如果还用赶班车来类比,那就是车已经上高速开走了,这班车是肯定赶不上了。不过我们还留下了行进路线和联系方式,迟到的人如果想办法辗转到了目的地,还是可以和大部队会合的。最终,所有该到的人都会在目的地出现。所以总结起来,Flink 处理迟到数据,对于结果的正确性有三重保障:水位线的延迟,窗口允许迟到数据,以及将迟到数据放入窗口侧输出流。

~代码示例

// Define an OutputTag for late data
OutputTag<Tuple2<String, Integer>> lateDataOutputTag = new OutputTag<Tuple2<String, Integer>>("late-data"){};

// Apply a window to the stream with an allowed lateness of 5 seconds
DataStream<Tuple2<String, Integer>> windowedStream = inputStream.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
    .allowedLateness(Time.seconds(5))
    .sideOutputLateData(lateDataOutputTag); //Late data enters the measurement output stream

// Process the main output stream
windowedStream.apply((window, values, out) -> {
  // values in this stream will include only those that arrived within 5 seconds of the end of the window
});

// Process the late data output stream
DataStream<Tuple2<String, Integer>> lateDataStream = windowedStream.getSideOutput(lateDataOutputTag);
lateDataStream.apply((window, values, out) -> {
  // values in this stream will include late data that arrived more than 5 seconds after the end of the window
});

在上面简单示例中,我们将一个窗口应用于输入流,最大延迟为 5 秒。该sideOutputLateData()方法用于将任何迟到的数据输出到侧输出流,该侧输出流使用该getSideOutput()方法和lateDataOutputTagOutputTag 进行访问。

主输出流将仅包含在窗口结束后 5 秒内到达的那些值,而延迟数据输出流将包含在窗口结束后超过 5 秒到达的任何值。文章来源地址https://www.toymoban.com/news/detail-463323.html

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

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

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

相关文章

  • 【Flink基础】-- 延迟数据的处理

    目录 ​一、关于延迟的一些概念 1、什么是延迟? 2、什么导致互联网延迟?

    2024年02月03日
    浏览(44)
  • Flink流处理案例:实时数据聚合

    Apache Flink是一个流处理框架,可以处理大规模数据流,实现实时数据处理和分析。Flink支持各种数据源和接口,如Kafka、HDFS、TCP流等,可以实现高吞吐量、低延迟的流处理。 在本文中,我们将通过一个实际的Flink流处理案例来讲解Flink的核心概念、算法原理和最佳实践。我们将

    2024年02月19日
    浏览(46)
  • Flink之数据乱序处理

    在了解为什么会乱序之前我们先来看一下在Flink中的时间语序。 1.1  Flink Time  时间语义 Event Time:事件产生的时间,它通常由事件中的时间戳描述。 Ingestion Time:事件进入Flink的时间。 Processing Time:事件被处理时当前系统的时间。 这三种时间的对应关系如下图所示: 1.2  数

    2024年02月07日
    浏览(40)
  • 大数据Flink(六十一):Flink流处理程序流程和项目准备

    文章目录 Flink流处理程序流程和项目准备 一、Flink流处理程序的一般流程

    2024年02月11日
    浏览(39)
  • 大数据Flink(五十三):Flink流处理特性、发展历史以及Flink的优势

    文章目录 Flink流处理特性、发展历史以及Flink的优势 一、Flink流处理特性 二、发展历史

    2024年02月14日
    浏览(54)
  • Flink流处理案例:实时数据去重

    在大数据处理领域,实时数据流处理是一项至关重要的技术,可以帮助我们实时分析和处理数据,从而更快地做出决策。Apache Flink是一款流处理框架,具有高性能和低延迟的特点,可以处理大规模的实时数据流。在本文中,我们将讨论Flink流处理的一个案例,即实时数据去重

    2024年04月27日
    浏览(36)
  • flink数据延迟原因及详细处理方案

    数据输入环节问题:可能是数据来源的数据增长速度过快,导致flink消费者处理数据的速度跟不上数据生成的速度。解决方案:增加flink消费者的并发度,使用分区和并行流的方式来处理数据,以保证消费者可以快速地处理大量的数据。 数据输出环节问题:可能是flink消费者完

    2024年02月13日
    浏览(37)
  • 使用Flink处理Kafka中的数据

    目录         使用Flink处理Kafka中的数据 前提:  一, 使用Flink消费Kafka中ProduceRecord主题的数据 具体代码为(scala) 执行结果 二, 使用Flink消费Kafka中ChangeRecord主题的数据           具体代码(scala)                 具体执行代码①                 重要逻

    2024年01月23日
    浏览(54)
  • Flink实时大数据处理性能测试

    Flink是一个开源的流处理框架,用于实时大数据处理。它可以处理大量数据,提供低延迟和高吞吐量。Flink的性能测试是一项重要的任务,可以帮助我们了解其在实际应用中的表现。在本文中,我们将讨论Flink实时大数据处理性能测试的背景、核心概念、算法原理、代码实例、

    2024年03月18日
    浏览(52)
  • 【大数据】Flink 架构(三):事件时间处理

    《 Flink 架构 》系列(已完结),共包含以下 6 篇文章: Flink 架构(一):系统架构 Flink 架构(二):数据传输 Flink 架构(三):事件时间处理 Flink 架构(四):状态管理 Flink 架构(五):检查点 Checkpoint(看完即懂) Flink 架构(六):保存点 Savepoint 😊 如果您觉得这篇

    2024年02月21日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包