窗口

在流上的工作方式与批处理不同,因为流通常是无限的,所以不可能计算流中的所有元素,流上的聚合事件则由窗口限定,例如“过去 5 分钟的计数”或“最后 100 个元素的总和”。划定的一段范围,称为窗口;在这个范围内的数据进行处理,就是窗口计算。

窗口按照驱动类型可分为:时间窗口、基数窗口。

按照窗口分配数据的规则可分为:滚动窗口、滑动窗口、会话窗口、全局窗口

时间语义

当在流式程序中,可以引用不同的时间概念:处理时间、事件时间、摄入时间

处理时间:执行处理操作的机器的系统时间;

事件时间:每个事件在对应设备上发生的时间,即数据产生的时间;

摄入时间:数据进入flink数据流的时间,即数据源算子读入数据的时间,相当于事件时间和处理时间的中和,把数据源任务的处理时间当作数据的产生时间添加到数据里。

水位线

在实际应用中,一般会采用事件时间语义。而水位线,就是基于事件时间提出的概念。

在数据流中加入一个时钟标记,记录当前的事件时间;这个标记可以直接广播到下游,当下游任务收到这个标记,就可以更新自己的时钟了。在 Flink中,这种用来衡量事件时间进展的标记,就被称作“水位线 Watermark)。

为了提高效率,一般会每隔一段时间生成一个 水位线,这个水位线的时间戳,就是当前最新数据的时间戳。

注意:对于水位线的周期性生成,周期时间是指处理时间,而不是事件时间。

有序流

对于有序流,主要特点就是时间戳单调增长,所以永远不会出现迟到数据的问题。这是周期性生成水位线的最简单的场景,就是直接拿当前最大的时间戳作为水位线就可以了。

stream.assignTimestampsAndWatermarks(WatermarkStrategy.<Event>forMonotonousTimestamps().withTimestampAssigner(new SerializableTimestampAssigner<Event>()@Overridepublic long extractTimestamp(Event event, long recordTimestamp)return event.timestamp;}})
}

 乱序流

由于乱序流中需要等待迟到数据到齐,所以必须设置一个固定量的延迟时间。这时生成水位线的时间戳,就是当前数据流中最大的时间戳减去延迟的结果,相当于把表调慢,当前时钟会滞后于数据的最大时间戳。

stream.assignTimestampAndWatermarks(// 针对乱序流插入水位线,延迟时间设置为 5sWatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(5)).withTimestampAssigner (new SerializableTimestampAssigner<Event>() {// 抽取时间戳的逻辑@Overridepublic long extractTimestamp(Event element, long recordTimestamp) {return element.timestamp;}})
}

注意:乱序流中生成的水位线真正的时间戳,其实是当前最大时间戳—延迟时间—1。在BoundedOutOfOrdernessWatermarks的源码onPeriodicEmit()可以看到。

迟到数据

迟到数据是指某个水位线之后到来的数据,其自身的时间戳应该在水位线之前,并且只有在事件时间语义下,迟到数据的处理才有意义。具体处理办法如下:

1、设置水位线延迟时间

        水位是所有事件时间定时器触发的判断标准。那么水位线的延迟,就是全局时钟的滞后。当我们设置了水位线延迟时间后,所有定时器就都会按照延迟后的水位线来触发。如果一个数据所包含的时间戳,小于当前的水位线,那么它就是迟到数据。

stream.assignTimestampAndWatermarks(WatermarkStrategy.<Event>forBoundedOutOfOrderness(Duration.ofSeconds(2)).withTimestampAssigner (new SerializableTimestampAssigner<Event>() {@Overridepublic long extractTimestamp(Event element, long recordTimestamp) {return element.timestamp;}})
}

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

        因为流处理的实时性至关重要,所以一般情况下不会把水位线的延迟设置的太大。当水位线延迟时间设置较短时,可考虑使用Flink的窗口,Flink的窗口也是可以设置延迟时间,允许继续处理迟到数据的。

.allowedLateness(Time.minutes(1))

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

经过上两种方式,已经能够处理大部分迟到数据,但窗口不能一直不关闭。为了保证处理结果的正确性,一旦窗口关闭,需要对剩余小部分的迟到数据进行处理。

最后一种方式是:用窗口的侧输出流来收集关窗以后的迟到数据,但只能保证数据不丢失;因为窗口已经真正关闭,所以是无法基于之前窗口的结果直接做更新的。我们只能将之前的窗口计算结果保存下来,然后获取侧输出流中的迟到数据,判断数据所属的窗口,手动对结果进行合并更新。尽管有些烦琐,实时性也不够强,但能够保证最终结果一定是正确的。

.sideOutputLateData(xxxxx)

总结

Flink处理迟到数据,对于结果的正确性有三重保障:水位线的延迟,窗口允许迟到数据,将迟到数据放入窗口侧输出流。

【Flink】迟到数据的处理相关推荐

  1. Flink迟到数据输出到测输出流

    一.迟到的数据如何处理? Event Time语义下我们使用Watermark来判断数据是否迟到.一个迟到元素是指元素到达窗口算子时,该元素本该被分配到某个窗口,但由于延迟,窗口已经触发计算.目前Fl ...

  2. flink 三种时间机制_Flink时间系列:Event Time下如何处理迟到数据

    Event Time语义下我们使用Watermark来判断数据是否迟到.一个迟到元素是指元素到达窗口算子时,该元素本该被分配到某个窗口,但由于延迟,窗口已经触发计算.目前Flink有三种处理迟到数据的 ...

  3. Flink 窗口函数(Window Functions)处理迟到数据

    文章目录 将迟到的数据放入侧输出流 Lambda架构:用一个流处理器,先快速的得到一个正确,近似正确的结果,然后在另外一层是一个批处理器,然后在它是一直等着的,等所有数据都到齐了,计算出一个最终准确的 ...

  4. 【学习笔记 — Flink 处理迟到数据(★)】

    Flink 处理迟到数据(★) 处理迟到数据之前首先了解Lambda架构 Lambda架构的实现是:一个批处理器.一个流处理器.流处理器首先实时输出近似正确的结果(因为乱序流,可能导致流处理结果不准确 ...

  5. flink笔记8(接笔记7——窗口(Window),迟到数据的处理)

    flink 3. 窗口(Window) (1)窗口的概念 (2)窗口的分类 (3)窗口 API 概览 (4)窗口分配器(Window Assigners) (5)窗口函数(Window Functio ...

  6. Flink 对于迟到数据的处理

    WaterMark 和 Window 机制解决了流式数据的乱序问题,对于因为延迟而顺序有误的数据,可以根据eventTime进行业务处理. Event Time语义下我们使用Watermark来判断数 ...

  7. Flink中迟到数据的处理

    目录 设置水位线延迟时间 允许窗口处理迟到数据 将迟到数据放入窗口侧输出流 总结:         我们知道,所谓的"迟到数据"(late data),是指某个水位线之后到来的数据 ...

  8. flink 处理迟到数据(Trigger、设置水位线延迟时间、允许窗口处理迟到数据、将迟到数据放入侧输出流、代码示例、迟到数据触发窗口计算重复结果处理)

    文章目录 前言 1.Trigger 2.处理迟到数据 2.1 设置水位线延迟时间 2.2 允许窗口处理迟到数据 2.3 将迟到数据放入侧输出流 3.实操 3.1 代码示例 3.2 中间遇到的异常 3. ...

  9. Flink之乱序处理,时间语义,WaterMark,允许迟到数据,侧输出流

    一.理解Flink的乱序问题 理解Flink的乱序问题,的先理解Flink的时间语义. Flink有3中时间语义:Event Time:事件创建的时间Ingestion Time:数据进入Flink的 ...

最新文章

  1. 深度学习到底有哪些卷积?
  2. 制作win2000能用的 schtasks.exe
  3. CommunityServer 2.0 RTM时间是:2006-02-17 --Scott Watermasysk今天中午
  4. 程序猿要什么爱情,陪你未来的是键盘和代码啊!
  5. 冯诺依曼机器人_冯·诺依曼型计算机的五大组成部分是什么?
  6. Shell——流程控制
  7. [Ext JS 4] 实战之Load Mask(加载遮罩)的显示与隐藏
  8. 如何快速入手 Shell 脚本编程
  9. 学生物的女朋友都能看懂的哈希表总结!
  10. Windows Mobile 6 模拟器绿色中文版 - 在PC上模拟并运行智能手机的软件游戏
  11. 技嘉h310主板前置音频没声音_急死人!新装机箱前置音频没声音?不要急!一招轻松解决。...
  12. linux opendir路径_Linux C - opendir 和 readdir 和 closedir - 目录文件打开
  13. 学习:网络接口RJ45
  14. 2022年微信权重号养号方法
  15. 利用Spire实现对Word模板的指定文字替换(文字、图片、表格)
  16. 美容院共享系统开发|共享模式具体应该怎么去做?
  17. IGraphicsContain 删除元素
  18. 独立产品灵感周刊 DecoHack #013
  19. python+requests接口测试
  20. Mac安装软件时提示“文件已损坏,您应该将它移到废纸篓”解决办法

热门文章

  1. 完成用户注册之后,跳转到用户注册的邮箱所在的网址
  2. java求一个数的因子
  3. TPM2 工作原理及操作 -- API Doc(一)
  4. asp.net response.ContentType 下载文件的四种方法
  5. eNSP报40错误 Virtualbox启动设备失败 解决办法
  6. 理想职业计算机程序英语作文,我理想的职业英语作文
  7. 自动买卖炒股软件的设置条件?
  8. MP4Box使用命令大全
  9. MSN中英双语聊天机器人上线,邀请测试
  10. 马勒戈壁的.net mvc webapi中的ajax 、post与 frombody