实时数据开发|简单理解Flink流计算中解决乱序的机制--水位线

今天继续学习Flink的关键机制--水位线,虽然看文字有种浮于表面、难以理解的感觉,但是我觉得等开发中使用到的时候就会融会贯通了。

定义

Fink 相比其他流计算技术的一个重要特性是支持基于事件时间(event time)的窗口操作 。但是事件时间来自于源头系统,网络延迟、分布式处理以及源头系统等各种原因导致源头数据的事件时间可能是乱序的。水位线就是用来解决和衡量这种乱序的问题。

!NOTE\] "水位线"(Watermark)定义 用来衡量事件时间进展的标记,说白了就是事件时间戳。 一个水位线的时间戳声明任何 event time t'\

  • 有序流就是处理时间和事件时间相等 ,数据会按照生成的先后顺序,每条数据产生一个有先后顺序的水位线。这是一种理想的状态(数据量较小)。

  • 在实际生产中,由于多服务之间网络传输等的因素,处理时间总是大于事件时间,往往数据流是先后错乱,这就是乱序流。

由于数据是乱序的,为了让窗口能够正确的收集到迟到的数据,需要让窗口等上一段时间,即在数据的时间戳基础上加上一些延迟来尽量保证不丢数据。

--- 水位线是Flink流处理中保证结果正确性的核心机制,往往会跟窗口一起配合,完成乱序数据处理。

生成

完美的水位线是"绝对正确 "的,也就是一个水位线一旦出现,就表示这个时间之前的数据已经全部到齐、之后再也不会出现了。

  • 如果要保证绝对正确,就必须等足够长的时间,这会带来更高的延迟;
  • 如果希望实时性更强,可以将水位线延迟设得低一些。可能会导致窗口遗漏数据,计算结果不准确

所以水位线是流处理中对低延迟和结果正确性的一个权衡机制,可以在代码中定义水位线的生成策略。

水位线生成最常用的办法是with periodic watermark,其含义是定义一个最大允许乱序的时间,比如某条日志时间为2024-11-23 08:00:10,如果定义最乱序时间为10s,那么其水位线时间戳就是2024-11-23 08:00:00,其含义就是说8点之前的所有数据都已经到达。那么某个小时窗口此时就可以触发并计算该小时内的业务指标。

相关推荐
最初的↘那颗心3 小时前
Flink Stream API 源码走读 - window 和 sum
大数据·hadoop·flink·源码·实时计算·窗口函数
青云交15 小时前
Java 大视界 -- 基于 Java 的大数据可视化在城市交通拥堵治理与出行效率提升中的应用(398)
java·大数据·flink·大数据可视化·拥堵预测·城市交通治理·实时热力图
还是大剑师兰特21 小时前
Flink面试题及详细答案100道(1-20)- 基础概念与架构
大数据·flink·大剑师·flink面试题
sleetdream1 天前
Flink Sql 按分钟或日期统计数据量
sql·flink
阿Paul果奶ooo2 天前
Flink中基于时间的合流--双流联结(join)
大数据·flink
Direction_Wind2 天前
Flinksql bug: Heartbeat of TaskManager with id container_XXX timed out.
大数据·flink·bug
最初的↘那颗心2 天前
Java 泛型类型擦除
java·flink
最初的↘那颗心3 天前
Flink Stream API 源码走读 - socketTextStream
大数据·flink
都叫我大帅哥3 天前
Flink Slot 终极指南:从入门到避坑,幽默解析分布式计算的“工位经济学
java·大数据·flink
阿Paul果奶ooo4 天前
Flink概述
大数据·flink