Flink 为实时计算提供了三种时间,即事件时间(event time)、摄入时间(ingestion time)和处理时间(processing time)。在进行 window 计算时,使用摄入时间或处理时间的消息都是以系统的墙上时间(wall clocks)为标准,因此事件都是按序到达的。然而如果使用更为有意义的事件时间则会需要面对乱序事件问题(out-of-order events)和迟到事件问题(late events)。针对这两个问题,Flink 主要采用了以水位线(watermark)为核心的机制来应对。

1. 窗口与水位线

当基于事件时间的数据流进行窗口计算时,最为困难的一点是如何确定对应当前窗口的事件已尽全部到达。比如需要统计最近5分钟打开音乐播放器的用户数,服务端怎么确保聚合计算时已经收集好所有用户最近5分钟的打开播放器日志?事实上不存在能百分百准确判断的方法,因此业界常用的方法是基于已经收集的消息来估算是否还有消息未到达,这就是水位线的思想。

水位线实际上是一个时间戳,意义是早于该时间的消息已经完全抵达计算引擎,即假设不会再有时间小于水位线的事件到达。这个假设是触发窗口计算的基础,只有水位线越过窗口对应的结束时间,窗口才会关闭和进行计算。

1.1 水位线的计算

理想情况下水位线应该与处理时间一致,并且处理时间与事件时间只相差常数时间甚至为零,这意味着消息产生后马上被处理。然而水位线的计算总是存在一定的延迟,具体的延迟根据水位线实现的不同而也有所差别。Flink 提供了常规的定期水位线以及定制化的标点水位线两种生成水位线的方式供用户选择。

1.2 定期水位线

定期水位线(Periodic Watermark)按照固定时间间隔生成新的水位线,不管是否有新的消息抵达。水位线提升的时间间隔是由用户设置的,在两次水位线提升时隔内会有一部分消息流入,用户可以根据这部分数据来计算出新的水位线。举个例子,最简单的水位线算法就是取目前为止最大的事件时间,然而这种方式比较暴力,对乱序事件的容忍程度比较低,容易出现大量迟到事件。

应用定期水位线需要实现AssignerWithPeriodicWatermarks API

其中extractTimestamp用于从消息中提取事件时间,而getCurrentWatermark用于生成新的水位线,新的水位线只有大于当前水位线才是有效的。每个窗口都会有该类的一个实例,因此可以利用实例的成员变量保存状态,比如上例中的当前最大时间戳。

1.3 标点水位线

标点水位线(Punctuated Watermark)通过数据流中某些特殊标记事件来触发新水位线的生成。这种方式下窗口的触发与时间无关,而是决定于何时收到标记事件。

应用标点水位线需要实现AssignerWithPunctuatedWatermarks API

其中extractTimestamp用于从消息中提取事件时间,checkAndGetNextWatermark用于检查事件是否标点事件,若是则生成新的水位线。不同于定期水位线定时调用getCurrentWatermark,标点水位线是每接受一个事件就需要调用checkAndGetNextWatermark,若返回值非 null 且新水位线大于当前水位线,则触发窗口计算。

2. 迟到事件

虽说水位线表明着早于它的事件不应该再出现,但是上如上文所讲,接收到水位线以前的的消息是不可避免的,这就是所谓的迟到事件。实际上迟到事件是乱序事件的特例,和一般乱序事件不同的是它们的乱序程度超出了水位线的预计,导致窗口在它们到达之前已经关闭。

迟到事件出现时窗口已经关闭并产出了计算结果,因此处理的方法有3种:

  1. 重新激活已经关闭的窗口并重新计算以修正结果。
  2. 将迟到事件收集起来另外处理。
  3. 将迟到事件视为错误消息并丢弃。

Flink 默认的处理方式是第3种直接丢弃,其他两种方式分别使用Side OutputAllowed Lateness

Side Output机制可以将迟到事件单独放入一个数据流分支,这会作为 window 计算结果的副产品,以便用户获取并对其进行特殊处理。

Allowed Lateness机制允许用户设置一个允许的最大迟到时长。Flink 会再窗口关闭后一直保存窗口的状态直至超过允许迟到时长,这期间的迟到事件不会被丢弃,而是默认会触发窗口重新计算。因为保存窗口状态需要额外内存,并且如果窗口计算使用了 ProcessWindowFunction API 还可能使得每个迟到事件触发一次窗口的全量计算,代价比较大,所以允许迟到时长不宜设得太长,迟到事件也不宜过多,否则应该考虑降低水位线提高的速度或者调整算法。

Flink Watermark相关概念(窗口、水位线、迟到事件)相关推荐

  1. Flink-时间和窗口(水位线、窗口、迟到数据的处理等)

    文章目录 时间和窗口 时间 水位线(Watermark) 时间和窗口 水位线 有序和无序流的插入 水位线生成策略(Watermark Strategies) 水位线的传递 窗口(Window) 窗口 ...

  2. Flink 时间语义与水位线(Watermarks)

    文章目录 时间语义 水位线(Watermarks) 时间语义 对于流式数据处理,最大的特点就是数据上具有时间的属性特征,Flink根据时间产生的位置不同,将时间区分为如下三种时间概念 事件时间(Eve ...

  3. flink 6-检查点和水位线

    保持数据一致性 checkpoint watermark

  4. 一文理解Flink 水位线(Flink Watermark)

    文章目录 Flink 中的时间语义 `处理时间` `事件时间` 水位线(Watermark) `事件时间和窗口` `什么是水位线` 有序流中的水位线 乱序流中的水位线 `水位线的特性` `如何生成水位 ...

  5. 【Flink】Flink中的窗口API、窗口函数以及迟到数据处理问题

    目录 一.窗口 1.窗口的概念 2.窗口的分类 (1)按照驱动类型分类--时间窗口和计数窗口 (2)按照窗口分配数据的规则分类 3.窗口 API (1)按键分区窗口(Keyed Windows) (2 ...

  6. 4.1.19 Flink-流处理框架-Flink中的时间语义和watermark水位线

    目录 1.Flink中的时间语义 1.1 EventTime 的代码设置 2.Watermark水位线 2.1 watermark的基本概念 2.2 watermark的特点和传递 2.3 Water ...

  7. Flink实时仓库-DWS层(关键词搜索分析-自定义函数,窗口操作,FlinkSql设置水位线,保存数据到Clickhouse)模板代码

    简介 关键词搜索实时分析,技术要点,自定义FlinkSql函数,使用聚合功能把结果输出到clickhourse 前置知识 ik分词 <dependency><groupId>c ...

  8. Flink Pre-defined Timestamp Extractors / Watermark Emitters(预定义的时间戳提取/水位线发射器)...

    https://ci.apache.org/projects/flink/flink-docs-release-1.6/dev/event_timestamp_extractors.html 根据官网 ...

  9. Flink应如何处理窗口中迟到的数据?

    一.如何处理迟到的数据 三个步骤: .1 设置水位线延迟时间 因为水位线的延迟主要是用来对付分布式网络传输导致的数据乱序,而网络传输的乱序程度一般并不会很大,大多集中在几毫秒至几百毫秒.所以实际应用中 ...

最新文章

  1. 一文盘点AutoML 库,自动机器学习演讲摘要
  2. 【工具使用系列】关于 MATLAB 液压元件,你需要知道的事
  3. android某个活动全屏,android – 重新组合活动布局,以便在旋转屏幕时全屏播放视频...
  4. 企业研发人员配备比例_企业管理人员合理配置比例
  5. 什么是物联网?—Vecloud 微云
  6. 随机交换检验数据挖掘结果-assessing data mining result via swap randomization
  7. R中与数据挖掘相关的package
  8. 利用new Object创建对象
  9. 排除某个类_Spark Troubleshooting(故障排除)
  10. 漂亮html表格页面模板,四款好看实用的CSS表格样式分享
  11. IDEA打包失败解决方案
  12. PAT-求特殊方程的正整数解(简单编程题)
  13. 计算N阶行列式的详细讲解(C语言)(降阶法)(函数递归)
  14. hive学习第五章:查询
  15. 爱奇艺动画屋 android,爱奇艺奇巴布(com.qiyi.video.child) - 11.5.5 - 应用 - 酷安
  16. 小白学习java第11天多态抽象类接口
  17. js汉语转拼音(全拼、首字母、拼音首字母)
  18. 2021软科计算机科学与技术,2021软科排名,NTU 十学科跻身世界前十!
  19. UnityShader案例篇—旋转、平移和缩放
  20. 极客日报:贾跃亭回应是否有回国打算:那必须的;顺丰将拿出 2 亿元给快递员加薪;OpenAI 宣布解散机器人团队

热门文章

  1. 306医院新一代移动护理系统设计与实现
  2. SEO经验分享之偷鸡不成蚀把米
  3. memcpy函数实现(c语言)
  4. Visual Studio 2017 快捷键
  5. C++计算机高级程序设计语言
  6. Scratch学习笔记导图
  7. 佳能c3020维修模式 白电平调整_佳能3020复合机电路及故障详解
  8. 单片机c语言数码管显示子程序,单片机C语言之两位数码管动态显示
  9. IoGetDeviceProperty 例程
  10. 【C语言】调试方法和技巧详解