Flink中的Watermark是什么?它有什么用?

本文旨在理解,不谈代码。如有谬误,感谢指正。

附上官方文档链接

在流计算中事件的发生时间(Event time)和处理时间(processing time)是两个不同的概念。Flink假设数据到达是乱序的,这是著名流计算模型DataFlow的一个基本假设,也符合我们在分布式系统中的常识。简单地说,就是出于网络延迟等原因,来自不同地方的数据到达算子并被处理的时间(processing time)顺序与数据产生时的时间的(event time)顺序不同。这就会为我们做事件时间窗口统计(event-time windowing)带来一些麻烦。

我们来假想一个场景。我们在收银台采集客户进入排队区的时间,并根据一段时间内进入排队区的客户数量,来决定接下来的一段时间在收银台配置多少员工收银(是的,这不是个好办法:P)。比如,之前十分钟共有10个人排队,接下来十分钟就只配置1个员工。之前有20个人排队,接下来10分钟就配置2个员工。我们在排队区装了两个传感器作为数据源,各自负责不同的范围(假设顾客不会同时触发两个传感器)。每当一个顾客进入其中一个的感应范围,就产生一条携带当前时间的数据(event time)。这些数据会被发送给一个计数的算子。乱序假设意味着如果一个客人在7:00开始排队(event time)并触发传感器A,另一个客人在7:30开始排队并触发传感器B,则7:30的这条数据可能要比7:00的数据更早到达算子并被处理(processing time)。一个可能的场景是:传感器A在发送7:00的数据之前出现了网络故障,所以它暂时将数据缓存起来。网络在B的7:30的数据被算子收到之后才恢复,这时A才将7:00的数据发出去。从另一个角度看乱序问题,我们会发现当算子看到7:30的数据时,它并不能确定之后会不会收到比7:30更早的数据。

假如我们要统计7:00-7:10这个时间窗口内有多少客人在排队,那我们要什么时候进行最终的统计才能确保数据的准确性呢?显然,我们统计的越晚,数据准确的可能性就越大(乱序的数据陆陆续续的都来了)。但是,如果7:00-7:10有很多人排队,急需增加收银员,我们在9:00才去统计,那等我们统计完并且决定增派人手的时候,排队的顾客早就结完账了,我们的程序就失去了意义。所以,在流计算中我们经常要在准确性和时效性之间做出取舍。我们可能会决定说,过了7:11,没到的数据就不统计了,我们就依据当前算子已有的数据决定配置多少收银员。如果真的有7:00-7:10的数据在7:11之后到达算子,我们再去订正统计结果(但是这个时候,决策已经做出了)。

DataFlow模型中使用了“Watermark”的概念来对应我们上述的场景,这个概念也被实现在Flink中。我们在流计算中把数据流类比为水流。watermark(水位线)表示当前的event time到了什么时候。这个类比非常形象,给算子输入数据流就像是在往水槽里灌水,在当前水位线以下的水肯定都是之前流进来的。在flink中,watermark也会像数据一样传输给下游。上面的例子中,我们决定在7:11统计7:00-7:10这个窗口并做出决策,也就是说我们觉得:“一分钟之内,新产生的数据一般能到达算子”,或者我们认为“7:11之后,7:00-7:10窗口中的数据将失去价值”,又或者是这二者之间的权衡。总之,两个数据源会各自不断地发出时间戳为一分钟之前的watermark。比如在7:10的时候发出7:09的watermark、在7:11的时候,发出带有7:10时间戳的watermark。而当算子收到两个数据源的watermark,安全起见会取两者中更早的那一个作为最终的watermark。当最终的watermark更新到7:10时,算子就明白了:“可以统计7:10之前的窗口数据了”。

顺带一提,我们可以对这些迟到的数据(比watermark标记的时间戳更早,但比watermark到达算子更晚的数据)进行特殊的处理。我们可以设置一个最大容忍时间(Flink默认是0,即直接丢弃),在这段时间内的迟到数据还是会被算入window里面,并且使新的window结果被重新发送。如果超过可容忍的时间,它依然会被丢弃。除了更新window和丢弃,我们还可以将迟到数据写入日志,用作日后处理历史数据时获取精准的结果。这都取决于应用的具体需求。

简单地说,flink中的watermark是为了让我们能够权衡event-time windowing的结果的准确性和时效性的手段。准确性和时效性的矛盾源自与数据的乱序问题。

Flink中的Watermark是什么原理?它有什么用?相关推荐

  1. flink中的WaterMark调研和具体实例

    一些基本概念介绍: Event Time 事件时间是每个事件在其生产设备上发生的时间 Ingestion Time 摄取时间是数据进入Flink的时间 Processing Time 处理时间是是指正 ...

  2. 60-300-022-使用-延迟数据-Flink中allowedLateness详细介绍

    1.视界 2.概述 ​ 当指定一个允许延迟大于0时,window以及window中的内容将会继续保持即使水印已经达到了window的最后时间.在这种情况下,当一个延迟事件到来而未丢弃时,它可能会触发w ...

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

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

  4. 14.State-理解原理即可、Flink中状态的自动管理、无状态计算和有状态计算、状态分类、Managed State Raw State\Keyed StateOperator State

    14.State-理解原理即可 14.1.Flink中状态的自动管理 14.2.无状态计算和有状态计算 14.2.2.有状态计算,需要考虑历史值,如:sum 14.2.3.状态分类 14.2.4.Ma ...

  5. Flink中window 窗口和时间以及watermark水印

    我们都知道,Flink的核心是流式处理,但同时也支持批处理,Flink底层是一个流式引擎,在这个上面实现了流处理和批处理,而窗口则是批处理的实现. 在Flink中window从大的分类上主要有三种:T ...

  6. 关于Flink中time与watermark的理解

    关于Flink中time与watermark的理解 空间和时间只是我们人类思考的模式,并不是我们赖以生存的条件. --爱因斯坦 时间属性是流处理中最重要的一个方面,是流处理系统的基石之一:流计算是一种 ...

  7. Flink中的Time与Window

    一.Time 在Flink的流式处理中,会涉及到时间的不同概念 Event Time:是事件创建的时间.它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink通 ...

  8. 如何在 Apache Flink 中使用 Python API?

    本文根据 Apache Flink 系列直播课程整理而成,由 Apache Flink PMC,阿里巴巴高级技术专家 孙金城 分享.重点为大家介绍 Flink Python API 的现状及未来规划, ...

  9. python flink_如何在 Apache Flink 中使用 Python API?

    原标题:如何在 Apache Flink 中使用 Python API? 导读:本文重点为大家介绍 Flink Python API 的现状及未来规划,主要内容包括:Apache Flink Pyth ...

最新文章

  1. 放置奇兵 新 粉石墨
  2. C# 反射中的GetType
  3. Android数据存储之SharePreference和内部存储
  4. C语言高级编程:数组和指针作为函数形参
  5. javadoc提取工具_使JavaDoc保持最新状态的工具
  6. java provider_Java SPI(Service Provider Interface)
  7. java向Oracle数据库中插入blob字段数据
  8. [UIKit学习]00.关于前置知识(storyboard,UIViewController,类扩展,项目属性)
  9. CVTE 2017 秋季校招一面(C++ 后台)
  10. 浅析移动互联浪潮之由来
  11. Docker之Jitsi Meet视频会议服务
  12. 如何在Mac电脑上打开终端
  13. 电脑版微信网络连接已断开,解决方案
  14. 2020年找工作越来越难,程序员真的过剩了吗?
  15. ECMAScript 6基础总结
  16. java 之动态生成类
  17. 在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这2.5亿个整数
  18. 两条线段之间的最短距离
  19. 如何搭建企业报表管理系统?
  20. 【Markdown】Typora中文手册

热门文章

  1. COM与COM+的区别
  2. 1500_什么是鱼骨图以及鱼骨图如何使用
  3. 3DMaxs快速导出全景图
  4. 写好日报、周报的重要性
  5. 常州一院有全消化道的机器人的_常州一院消化科
  6. 省常中集训Day2 2022.8.4
  7. css如何让height:100%起作用?
  8. 场景法设计测试用例atm_测试用例设计--场景法
  9. One solution to error: “Failed to compile generated C file xsim.dir/ ... /xsim_1.c“
  10. 边缘计算2.0时代,“云边缘”与“边缘云”你分清了吗?