浅谈WaterMark

一直在找理由,没有时间空下来总结一下flink相关的知识点,终于下了决心:后续专注了flink的专题总结。想了想还是以watermark开始,本文只是谈谈个人对待watermark的理解,如有哪里说得不恰当,欢迎讨论。起初对Flink的watermark感动一点困惑,经过时间的沉淀,源码断断续续的阅读,稍微清楚一点,下面我将从一些概念说起。

1、时间属性

Flink官方中有三种时间类型,Event Time(事件时间)、Processing Time(处理时间)和Ingestion Time(摄入时间),从字面意义上很容易理解其中一个大概,这里再陈述一下:

事件时间:一般来说,我们提供的事件时间通常是数据的原始创建时间,代表是事件发的时间,事件时间一定在数据的架构中,为数据的某一列。

处理时间:系统对事件进行处理的本地系统时间。

摄入时间:事件进入弗林克系统的时间其在概念上位于事件时间和处理蒂姆之间,在内部,摄入时间和事件时间非常相似,但具有自动时间戳分配和自动水印生成功能。

谈这三个时间主要是为了引出watemark,因为很多场景下,事件发生的时间事件时间是我们业务所关心的,基于事件时间计算,采用某种策略,则无论是采用实时流数据还是历史数据,都可以保证结果是一致的为了更生动的描述事件时间和事件流进系统(这里指Flink)的关系,特画了下面的图做解释:其中数字代表着某个事件的发生时间,可以看出事件实际到达的顺序和其发生的时间不一致。

针对实时流计算,一般的处理方式是来一个元素处理一个元素,这样才能实时。但是针对基于Event Time的一些应用,我们要求处理的准确性,必须缓存,因为第一个事件比如5到达时,不知道后面来的事件发生的时间比当前的事件早,因此必须要等到至少第二个事件到达才能确定是否输出第一个事件的计算结果,这样就会造成延迟。

但是在第二个事件3到达后,是否还有事件比事件3发生的事件更早呢,是否继续缓存等待下去?如果等待下去,等待多久呢?因此必须要有个机制策略保证不再等待,触发当前缓存的数据计算并输出。

那么,当前的计算已经计算并输出,如果再较早发生的事件晚到达了,怎么处理?如上图,假如在在事件9时我们触发了计算并输出了结果,可是下一个事件8到达了。我们想到了两种处理策略:1,把事件8加进上次缓存数据中重新计算输出; 2,丢弃不计算第二种策略丢弃不计算好处理,第一种策略需要上次的缓存数据,这里又会面临一个两个问题:1,上次缓存数据计算后不能清除缓存; 2,缓存要保留多久,因为如果一直保留缓存,势必造成增加整个系统的内存压力等。

带着这些问题,我们走进Flink。Flink的的watermark机制和lateness概念针对上述问题做了很好的全面解读。

注:本文主要讲述Flink使用EventTime的相关内容,flink默认的实时间属性是Processing Time,故需要通过Flink的接口env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)设置EvenTime时间特性。

2、水印的原理

Watermark是一种衡量Event Time进展的机制,它是数据本身的一个隐藏属性。通常一条记录中某个字段就代表了该记录的发生时间。例如基于Event Time的数据,自身都包含一个类型为timestamp的字段rowtime,例如1543903383(2018-12-04 14:03:03),定义一个基于rowtime列,策略为偏移3s的watermark,这条数据的水印时间戳则是:

1543903383-3000 = 1543900383(2018-12-04 14:03:00)

该条数据的水印时间含义:timestamp小于1543900383(2018-12-04 14:03:00)的数据,都已经到达了。

2.1、窗口触发条件

上面谈到了对数据乱序问题的处理机制是watermark+window,那么window什么时候该被触发呢?

基于Event Time的事件处理,Flink默认的事件触发条件为:

对于out-of-order及正常的数据而言

1)watermark的时间戳> = window endTime

2)window有事件发生。

2,对于late element太多的数据而言(设置了lateness选项,默认为0)

1)Event Time > watermark的时间戳

2.2、图解Watermark

对于lateness选项我们先不考虑,后面再再提及。

我们设置一个偏移为5秒的watermark策略,大小为10秒的窗口,为了能更好的理解watermark,我们作如下类比,数据发生的时间空间为A时间空间,watermark的时间空间为B时间空间,则B时间空间总比A时间空间晚5秒发生。

如上图,矩形小框代表窗口大小,大小为10秒,Flink默认会根据选择的时间(这里是Event Time)分配窗口。假设数据发生的时间rowtime从0开始,则预先分配的窗口即使[0,10),[10,20],[20,30],[30,40] ......

A时间轴上的时刻是一定的,同样B时间轴上的时刻也是一定的,B空间时间轴上的时刻相对A时刻轴上的时刻总是晚5秒。在同一时间坐标系S下,假设S时间坐标和A时间一样,则A时间轴上的时刻在S坐标系下时间值不变,但B时间轴上的时刻在S时间坐标系下时间值都变“大” 5s了。即在第一个窗口[0,10],如果一个记录中rowtime为10s的数据在S坐标系下9s到达了,但是其watemark其实是10-5 = 5s,还没有到达第一个窗口的end Time,故不会触发窗口计算;如果一个记录中rowtime为8s的数据在S坐标系下12s到达了,但其watermark其实是8-5=3s小于之前的watermark,故此时不更新watermark(一般情况下),watermark的时间戳仍然是5秒,也没有达到第一个窗口的触发条件;如果一个记录中rowtime为12s的数据在S坐标系下13s到达了,其watemark其实是12-5 = 7 > 5,更新watermark的时间戳为7秒,但是也没有达到一个窗口的触发条件;如果一个记录中rowtime为15s的数据到达了,其watemark其实是15 -5 = 10s,达到了触发条件 ,大于window endTime,故窗口此时触发计算,如果后面再有rowtime<10s的数据到达,将会被丢弃(没有设置latness选项)。

这样看是不是感觉计算”延迟了5秒”,确实,计算延迟了,但是计算的延迟是针对设置的时间属性延迟的,这里是EVENTTIME,和系统时间没有关系。

2.3、Late Elements

某些元素有可能在watermark(t)发生之后,也会出现更多的时间戳t'<= t的元素。上文我们提到,默认情况下,当watermark> = Window EndTime后,这些晚到的元素将会被丢弃。但是现实业务处理中,我们又不希望丢弃这些元素,如果设置的watermark太大,数据积压又会导致系统性能下降。考虑到这一点,Flink允许为窗口指定一个最大延迟时间,这个最大延迟时间即是窗口触发计算后允许多长时间窗口的数据才能被删除,默认值为0。即当该窗口触发计算后,在最大延迟时间内,再有属于该窗口内的元素到达将会重新触发计算。

假设Flink设置的watermark允许延迟的策略为t1秒,设置的late Elements的lateness值为t2秒,窗口首次触发的的系统时间为t(假设已经转化为秒),则这些late Elements到达的系统时间如果在[t, t+t2)时间内,将会再次触发计算。

浅谈WaterMark_沧海笑007-CSDN博客_watermark  https://blog.csdn.net/ZLZ2017/article/details/84948191

(0)

相关推荐

  • flink time and watermark

    流处理中时间本质上就是一个普通的递增字段(long型,自1970年算起的微秒数),不一定真的表示时间. watermark只是应对乱序的办法之一,大多是启发式的,在延迟和完整性之间抉择.(如果没有延迟 ...

  • 「Flink」理解流式处理重要概念

    什么是流式处理呢? 这个问题其实我们大部分时候是没有考虑过的,大多数,我们是把流式处理和实时计算放在一起来说的.我们先来了解下,什么是数据流. 数据流(事件流) 数据流是无边界数据集的抽象 我们之前接 ...

  • 腾讯看点王展雄:实时数仓与多维实时分析系统搭建

    近几年,数字驱动的口号越喊越响,在这样一个用数据说话的时代,数据在一定程度上决定企业的业务和决策.而从数据驱动的方面考虑,多维实时数据分析系统的重要性也不言而喻.但是当数据量巨大的情况下,企业对数据技 ...

  • 实时计算、离线计算、流计算、批处理都分得清吗?就看这一篇..

    作者:陈守元(巴真),阿里巴巴高级产品专家 摘要:本文由阿里巴巴高级产品专家陈守元老师分享,详细讲解实时计算 Flink 的具体业务场景并分享实时计算 Flink 的相关应用案例. 内容分为以下四部分 ...

  • Flink在bilibili大数据与AI方向的探索与实践

    分享嘉宾:郑志升@bilibili 内容来源:Flink中文社区 导读:本文由 bilibili 大数据实时平台负责人郑志升分享,本次分享核心讲解万亿级传输分发架构的落地,以及 AI 领域如何基于 F ...

  • 浅谈乡村治理模式发生了哪些变化?

    随着乡村现代化的发展,越来越多的乡村走上了建设数字乡村的道路,从传统的乡村治理到使用互联网数字化治理的模式,乡村的风貌和农民的生活也发生了巨大的变化,接下来就让我们一起来了解一下乡村治理模式到底发生了 ...

  • 汽车是怎么开发出来的?浅谈汽车开发流程

    许良  汽车话题下的优秀答主你知道汽车是怎么开发出来的吗?你的脑海中很可能浮现出来这样一个画面:一个非常有艺术气息的设计师,在草图上帅气的描绘着看起来非常犀利的线条.对,但不全对.对于汽车工程师的我而 ...

  • 浅谈办公室装修的发展前景和趋势

    未来办公室装修的发展趋势会是怎样的?这是这个行业未来前景的重要话题.在这样一个新时代里,所有的事物都会以最新颖的方式出发.科技的发展也让每个行业都转遍了方向,同时对行业的要求和品质也有了更高的要求. ...

  • 颧骨浅谈

    ​骨过高 颧骨过于发达的人,单从脸部看上去就给人以高傲的感觉.而他们也得确有这种个性,常固执已见,虚张声势或显得自负是他们的特色.在工作上,也不愿意接受他人的忠告,总认为自己的就是最好的,这一点不利于 ...

  • 浅谈地龙在治疗咳喘中的运用

    浅谈地龙在治疗咳喘中的运用 笔者从事中医临床工作十多年来,在运用地龙治疗痰湿壅肺型.肺络瘀阻型.心肺两虚型.肾不纳气型的咳喘上有了一些心得,现介绍如下.   咳喘是现代医学中呼吸系统.心血管系统疾病的 ...

  • [鉴史释疑]曹操是英雄还是汉贼 浅谈曹操的英雄之处

    时间:2021-04-16 08:30:03    来源:本站(吾爱诗经网)整理       作者:魁哥说历史 在不同人眼里,曹操的形象和品格都是不一样的.有人觉得曹操是汉贼,但也有人说曹操是英雄,其 ...

  • 油车的教学真能开电车? 从驾校角度浅谈电动汽车事故

    可能是因为电动汽车正处汽车变革的"风口"中,所以因为电动汽车造成的事故在今年都能成为热搜榜的常客,刨去产品本身的原因不谈,在驾校的培训体系中有没有需要提升的部分? 我们都知道目前驾 ...

  • ​浅谈中医:心、肝、脾、肺、肾五脏异常会出现这些症状【推荐好文】

    在中医里,心.肝.脾.肺.肾这五脏不仅仅是身体器官,更是人体养生的最终落脚点.在繁忙的社会环境中,五脏承受了许多本不应该承受的负担,一些不良的习惯往往在潜移默化中伤害着五脏以及我们的身体健康.那么在这 ...

  • 瓷器鉴定基础知识(3):浅谈瓷器鉴定的基本方法

    古代瓷器,是历史的产物,其上会有历史的烙印.它们犹如文学作品一样,有其产生的时代背景,因此,鉴定一件瓷器就如同鉴赏一本书籍,需要从它的内容去进行解读和分析.瓷器的内容,不以文字形式呈现,而是以它的造型 ...