Flink之时间语义

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

Flink之时间语义

简介

Flink中时间语义可以说是最重要的一个概念了,这里就说一下关于时间语义的机制,我们下看一下下面的表格,简单了解一下

时间 定义
processing time 处理时间,也就是现实世界的时间,或者说代码执行时,服务器的时间
event time 事件时间,就是事件数据中所带的时间(业务意义上的时间),和现实世界中的时间无关,只以数据中所带的时间为准
ingestion time 注入时间,也就是数据进入到Flink系统中最开始的那个时间,这个没什么用处.开发中使用的基本就是处理时间和事件时间.

通过表格中的内容我们对这三类时间代表的内容应该都清楚了,后面会先介绍一下时间语义的执行机制和对应的API使用.

机制

推进时间

何为"时间标记",其实这里说的"时间标记"就是Flink中的WaterMark,是由于Operator[算子]中的定时器决定的,我们先看下图

Flink之时间语义,FLink,flink,大数据

图中我们是以event time为例子的,这样更便于理解

  1. 当数据从Mysql过来时,Operator中的定时器会先判断事件数据中所带的时间戳的大小
  2. 当得知事件数据中的时间戳是截止目前为止的最大时间戳时,会和时间标记进行比较,其实也就是和WaterMark进行比较,发现大于WaterMark时,就会将时间戳进行更换,如果小于怎么办?小于就证明这一条数据时迟到的数据,就会被抛弃(这是发生在1对1的情况下).
  3. 当时间标记更换完成后,就会将这个事件标记发送给下游算子.

推进时间选择

上面我们讲到了当时间标记更新完成后会发送给下游算子,试想一下如果下游的某个subtask接收的数据是上游的两个subtask发送来的数据时,且两条数据中的时间戳不同该怎么办?请看下图

Flink之时间语义,FLink,flink,大数据

  1. Operator(subtask)这个算子实例,接收到了来自上游的两个推进时间300700
  2. 接收到之后首先判断出两个上游发送来的推进时间中的最小值,在图中也就是300
  3. 判断出最小推进时间后,再和算子实例中存在的推进时间进行比较,如果大于当前算子实例中的推进时间则进行替换
  4. 更新算子实例中的推进时间后,继续发送给下游

迟到数据

前面讲到了关于推进时间的更换和推进时间的选择,这里讲一下Flink中的迟到数据,什么是迟到数据?就是字面意思,来晚了.

比如说某个算子实例中的推进时间是1000,但是来了一条数据的时间是500,怎么办?这条数据会被舍弃掉,在使用Flink的时候我们要牢记一点未来尚可努力,过去不可更改,Flink中的时间线和现实世界中的时间线是一样的,只会推进永远不会回退,顶多在Flink中的时间可以暂停,但是一定一定是不可以回退的.

请看下图:
Flink之时间语义,FLink,flink,大数据

  1. 首先当前算子实例还是会对推进时间进行判断,获取最新的推进时间(800)
  2. 当判断出推进时间为800时得知500~1000这个窗口还没有结束(窗口都是前闭后开)
  3. 接收上游发送来的数据,根据数据中的事件时间将其发送到不同的桶中,如800900的数据都符合当前桶(500~1000)的时间区间,那么就会将该数据分配到当前桶中,直到推进时间更新到1000时则开始计算当前桶中的数据
  4. 如果发现数据中的事件时间超出当前桶的时间区间,则会根据该数据中的时间时间划分未来桶,如10001200都属于1000~1500这个时间区间,假如这时来了一条1500 <= data < 2000的数据,这时又会划分出一个新的未来中,未来桶中的数据只要还没开始计算,就会一直这样划分下去.
  5. 700的数据来时,发现时间时间700小于当前算子实例中的推进时间800,则将700的数据抛弃, 虽然700的数据在500~1000的区间,但是时间遵循不可回退的原则,所以该条数据必然会被抛弃
  6. 将推进时间和计算完成的数据继续发往下游算子实例

推进时间暂停(即停止更新)

在Flink实时计算中还会出现一种情况,就是前面提到的,虽然时间不可回退,但是在Flink中可能会出现推进时间暂停的情况,这里就对这种情况进行说明,请看下图
Flink之时间语义,FLink,flink,大数据

  1. 同样下游的算子实例在选择推进时间时,会选择两个上游算子实例发来的推进时间中较小的那一个作为更新当前算子实例中的推进时间依据
  2. 通过上图可知WaterMak800的这个算子实例不再有新的WaterMark发送过来,所以对于下游的算子实例来说,不管另一个持续发送WaterMark的算子实例时间推进到哪里都没有作用了,也就是对于下游的算子实例时间已经暂停在800
  3. 当下游的算子实例时间暂停后,上游其中一个算子实例还在源源不断的发送WaterMark和数据,这时在下游的算子实例的窗口中就会根据数据中的事件时间以500为一个区间不断地构建一个一个的未来桶,将这些数据先放起来
  4. 发生这种情况时,如果时间过长就可能会导致程序崩溃报错,那么是否有解决方式呢?当然是有的,在Flink中为我们提供了一种机制watermark-idle-timeout,这个机制的作用是什么呢?当侦测到某一个支线一直没有数据进来,并且超过了watermark-idle-timeout设置的时间(比如说是2s),那么这个机制就会将推进时间往前推进2s,也就是说当我们将这个机制设置为2s时,那等待某个一直没有来数据支线的时间就是2s,到达2s这个临界值时就会自动更新推进时间

关于时间语义的机制大概就这些内容了,如有不对欢迎指正,如有问题共同探讨.文章来源地址https://www.toymoban.com/news/detail-662195.html

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

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

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

相关文章

  • Flink--8、时间语义、水位线(事件和窗口、水位线和窗口的工作原理、生产水位线、水位线的传递、迟到数据的处理)

                           星光下的赶路人star的个人主页                        将自己生命力展开的人,他的存在,对别人就是愈疗 1、从《星球大战》说起 为了更加清晰地说明两种语义的区别,我们来举一个非常经典的例

    2024年02月07日
    浏览(47)
  • 8 分钟看完这 7000+ 字,Flink 时间窗口和时间语义这对好朋友你一定搞得懂!外送窗口计算和水印一并搞懂!!!

    目录 一、时间语义 时间窗口 1. 前摘: 1.1 Flink的时间和窗口 1.2 什么是时间窗口和时间语义呢? 2. 时间窗口 2.1 举个例子: 2.2 3个实时数据计算场景 3. 时间语义 二、Flink上进行窗口计算: 1. 一个Flink窗口应用的大致骨架结构 2. Flink窗口的骨架结构中有两个必须的两个操作:

    2024年01月23日
    浏览(38)
  • Flink流数据窗口与时间

    随着大数据时代的到来,流处理技术变得越来越重要。流处理系统可以实时地处理大量数据,为实时应用提供有价值的信息。Apache Flink是一个流处理框架,它可以处理大规模的流数据,并提供丰富的功能,如窗口操作、时间操作等。在本文中,我们将深入探讨Flink流数据窗口

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

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

    2024年02月21日
    浏览(34)
  • 大数据-玩转数据-Flink时间滚动动窗口

    在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的网页。在这种情况下,我们必须定义一个窗口,用来收集

    2024年02月11日
    浏览(45)
  • 大数据Flink(七十一):SQL的时间属性

    文章目录 SQL的时间属性 一、Flink三种时间属性简介

    2024年02月10日
    浏览(41)
  • 玩转数据-大数据-Flink SQL 中的时间属性

    时间属性是大数据中的一个重要方面,像窗口(在 Table API 和 SQL )这种基于时间的操作,需要有时间信息。我们可以通过时间属性来更加灵活高效地处理数据,下面我们通过处理时间和事件时间来探讨一下Flink SQL 时间属性。 2.1、准备WaterSensor类,方便使用 2.2、DataStream 到

    2024年02月07日
    浏览(43)
  • Flink的流式数据处理与时间序列分析

    Apache Flink 是一个流处理框架,用于实时数据处理和分析。它支持大规模数据流处理,具有高吞吐量和低延迟。Flink 可以处理各种数据源和数据接收器,如 Kafka、HDFS、TCP 流等。 时间序列分析是一种用于分析时间序列数据的方法,用于发现数据中的趋势、季节性和随机性。时间

    2024年02月21日
    浏览(49)
  • flink时间窗口无新的数据进来最后一个窗口不关闭

    测试反馈, 配置的flink任务提交上去后, 输入数据源符合条件,到时间窗口的size。最后一个窗口没有闭窗计算,数据并没及时输出告警 经过调试发现,watermark没有向后继续推进,导致无法闭窗, watermark的时间取的是数据中的业务时间,create_time。 因为没有后续数据进来,

    2024年02月13日
    浏览(42)
  • 【Flink】FlinkCDC获取mysql数据时间类型差8小时时区解决方案

    1、背景: 在我们使用FlinkCDC采集mysql数据的时候,日期类型是我们很常见的类型,但是FlinkCDC读取出来会和数据库的日期时间不一致,情况如下 FlinkCDC获取的数据中create_time字段1694597238000转换为时间戳2023-09-13 17:27:18  而数据库中原始数据如下,并没有到下午5点,这就导致了

    2024年02月07日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包