Flink之数据乱序处理

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

一、数据为什么会乱序?

在了解为什么会乱序之前我们先来看一下在Flink中的时间语序。

1.1  Flink Time  时间语义

  • Event Time:事件产生的时间,它通常由事件中的时间戳描述。

  • Ingestion Time:事件进入Flink的时间。

  • Processing Time:事件被处理时当前系统的时间。

这三种时间的对应关系如下图所示:

flink 乱序数据处理,大数据

1.2  数据乱序的产生

在使用EventTime处理Stream数据的时候就会遇到数据乱序的问题。流处理从Event(事件)产生,流经Source,再到Operator,这中间需要一定的时间。虽然大部分情况下,传输到Operator的数据都是按照Event Time顺序来的,但是也不排除因为网络延迟等原因导致乱序的产生。特别是使用kafka的时候,多个分区间无法保证数据的有序性。

那么Flink针对乱序数据是如何处理的呢?

二、Flink是如何处理乱序数据的?

故事时间到~    

学校准备春游,春游是大家小时候最爱的活动了。

小明班计划的发车时间是09:00~09:10。

但是老师怕有同学迟到,赶不上一年一次的春游,所以让司机大叔把他自己的表的时间调慢了五分钟。(这样实际发车时间是09:05~09:15)

果然早上的时候学校附近有条路突然开始维修,导致部分同学在规定时间内无法到达,不过还好老师有先见之明,让司机大叔将表调慢了五分钟,九点十五前陆陆续续到了一部分。

不过还是有小部分同学没能在五分钟内赶到,也不能一直等着,所以老师便和司机大叔说先走但是前三分钟开慢点,让那些小部分已经快赶到的同学打车追过来,这样就也能上车了。

但总有一些家贼远,或者路上堵住了等各种问题,导致又过了三分钟还是没追上,可是也不能不让人家参加春游,毕竟一年一次,所以学校安排了备用车,送这些晚到很久的同学。最后,同学们都愉快的玩耍了起来。

总结:

故事中的班车:同一个班级上同一辆班车,对应的就是流式计算的窗口。

2.1  Flink为什么需要窗口计算?

我们知道在Flink的世界观中一切都是由流组成的,离线的数据是有界流,实时的数据是无界流。我们需要的是通过计算数据汇总产生结果。就算是有界流也不可能一直等数据,所以无论是有界流还是无界流就都需要规划一个范围来进行计算,这就是所谓的窗口。

窗口就是将无界流或者大的有界流切割成小的有界流的一种方式,它会将数据分发到有限大小的桶中进行分析。

flink 乱序数据处理,大数据

2.2 Flink中的窗口

  • 时间窗口(Time Window)

  1. 滚动时间窗口

  2. 滑动时间窗口

  3. 会话窗口

  • 计数窗口 (Count Window)

  1. 滚动计数窗口

  2. 滑动计数窗口

2.2.1 滚动窗口

flink 乱序数据处理,大数据

  • 将数据依据固定的窗口长度进行切分;

  • 时间对齐,窗口长度固定,没有重叠。

2.2.2 滑动窗口

flink 乱序数据处理,大数据

  • 滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口长度和滑动间隔组成;

  • 窗口长度固定,可以有间隔。

2.2.3 会话窗口

flink 乱序数据处理,大数据

  • 由一系列事件组合一个特定时间长度的timeout间隙组成,也就是一段时间没有接收到新数据就会生成新的窗口;

  • 时间无对齐。

2.3 如何进行窗口计算?

进行窗口计算,我们至少需要知道两个条件:

  • 数据的产生时间即 EventTime 

  • 在窗口内的数据,何时触发计算?

第一点很好解决,只需要在数据产生的时候将时间戳带过来就可以了。那么第二点,Flink是如何判断何时触发窗口计算的呢?并且第一个窗口是什么时候生成的呢?

在回答这个问题之前,让我们先来看一下以下三点:

2.3.1 有序事件

flink 乱序数据处理,大数据

理想情况下,数据都是严格有序的,那么这个时候流式计算引擎选定窗口时间后,是可以正确的将窗口内的数据计算出来的。然而理想很丰满,现实很骨感,现实中的数据往往都存在乱序的情况。

2.3.2 无序事件

flink 乱序数据处理,大数据

刚刚已经知道了数据必然存在乱序的可能,因此Flink需要有一种机制能让迟到的数据放在对应的窗口中进行计算。

还记得故事中,老师让司机大叔将自己的表调慢五分钟吗?对应的就是这种机制 Watermark -- 水位线。

2.3.3 Watermark -- 水位线

特点:

  • Watermark 是一个特殊的数据,本质上就是一个时间戳;

  • Watermark 必须单调递增,以确保任务的事件时间时钟一直在往前推进;

  • Watermark 与数据的时间戳有关。

为什么Watermark 能解决问题?

  • Watermark是一种告诉Flink一个消息延迟多少的方式,它定义了从什么时候开始可以不再等待更早的数据;

  • 可以把Watermarks理解为一个水位线,这个Watermarks在不断地变化。Watermark实际上作为数据流的一部分随数据流流动;

  • 当Flink中的运算符接收到Watermarks时,它明白早于该时间的消息已经完全抵达计算引擎,即假设不会再有时间小于水位线的事件到达;

  • 这个假设是触发窗口计算的基础,只有水位线越过窗口对应的结束时间,才会触发窗口计算操作。

下图详解了watermark的工作流程:

flink 乱序数据处理,大数据

如何防止数据丢失?

如果说故事中司机大叔故意将表调慢五分钟,对应的Flink设置水位线是防止数据短时间内错乱是第一道保险的话,那么老师让司机大叔开车后的前三分钟开慢点让后面的同学可以坐出租车追上,对应的就是Flink可以设置延迟时间,在延迟时间内(也就是数据的watermark时间)乱序数据可以再次进入对应的窗口进行计算便是Flink防止数据乱序的第二道保险。

flink 乱序数据处理,大数据

flink 乱序数据处理,大数据

 如果还有更晚到的数据呢?

对于实时数据,我们不好肯定可容错的水位线以及延迟时间可以防止所有晚到的数据进入窗口计算。

从性能,从实时性考虑我们都不能将水位线或者延迟时间拉得太长。

水位线与延迟时间的设置只能是开发人员基于业务,数据量,乱序的范围等综合考虑,是在不过多影响性能,实时性的前提下设计的。

那么更晚到的数据怎么办呢?

就如同刚刚的故事中,学校让更晚到的同学坐另一辆车去目的地一样,Flink对于更晚到的乱序数据的处理就是,将他们统一放入侧输出流中让开发人员自行处理。

flink 乱序数据处理,大数据

三、总结

  1. 通过 assignTimestampsAndWatermarks 来设置水位线时间,让短时间内大量迟到的数据可以进入对应的窗口,当水位线时间漫过窗口时间,开始触发窗口操作。

  2. 通过 allowedLateness 来设置延迟时间,让在延迟时间内迟到的数据可以进入窗口计算。

  3. 通过 sideOutputLateData 来设置侧输出流进行兜底,让更晚到的数据进入侧输出流中。

Flink最终就是用这一套组合拳来处理乱序数据的。     

Flink不同操作是可以分区的,那么在分区时watermark是如何传递的呢?大家可以结合实践好好思考下~

本期内容就到这里了,如果喜欢就点个关注吧,微信公众号搜索“数 新 网 络 科 技 号”可查看更多精彩内容~文章来源地址https://www.toymoban.com/news/detail-730213.html

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

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

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

相关文章

  • 大数据Flink(六十一):Flink流处理程序流程和项目准备

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

    2024年02月11日
    浏览(28)
  • Flink实时大数据处理性能测试

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

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

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

    2024年02月19日
    浏览(32)
  • Flink 算子:数据处理的魔法师

    用户通过算子能将一个或多个 DataStream 转换成新的 DataStream,在应用程序中可以将多个数据转换算子合并成一个复杂的数据流拓扑。 这部分内容将描述 Flink DataStream API 中基本的数据转换 API,数据转换后各种数据分区方式,以及算子的链接策略。 1. Map : 输入一个元素同时输

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

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

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

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

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

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

    2024年04月27日
    浏览(24)
  • 使用Flink处理Kafka中的数据

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

    2024年01月23日
    浏览(42)
  • 数据流处理框架Flink与Kafka

    在大数据时代,数据流处理技术已经成为了一种重要的技术手段,用于处理和分析大量实时数据。Apache Flink和Apache Kafka是两个非常重要的开源项目,它们在数据流处理领域具有广泛的应用。本文将深入探讨Flink和Kafka的关系以及它们在数据流处理中的应用,并提供一些最佳实践

    2024年04月23日
    浏览(30)
  • 从批处理到实时处理:Flink的数据处理变革和API扩展

    作者:禅与计算机程序设计艺术 Apache Flink是一个开源的分布式流处理平台,它由Apache Software Foundation(ASF)开发并于2015年9月发布。Apache Flink支持多种编程语言如Java、Scala、Python等进行编写,并且提供丰富的API接口方便用户进行数据处理。Flink的系统架构主要包括:JobManager、

    2024年02月12日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包