Flink系列三:时间概念与Watermark

一、时间概念类型

  • 事件生成时间(event time)

    每个独立事件在产生它的设备上发生的时间,在事件进入flink之前就已经嵌入到事件中,事件顺序取决于事件产生的地方和下游数据处理系统的时间无关,具有不变形。基于事件生成时间,数据处理过程依赖于数据本身产生的时间,这样能够借助于事件产生时的时间信息来还原事件的先后关系。

  • 接入时间(ingestion time)

    摄入时间是事件进入flink的时间,在source operator中,每个事件拿到当前时间作为时间戳,后续的时间窗口基于该时间。

  • 处理时间(processing time)

    事件被处理时当前系统的时间,Flink中有对数据处理的操作进行抽象,称为Transformation Operator,而对于整个Dataflow的开始和结束分别对应着Source Operator和Sink Operator,这些Operator都是在Flink集群系统所在的主机节点上,所以在基于ProcessTime的Notion进行与时间相关的数据处理时,数据处理依赖于Flink程序运行所在的主机节点系统时钟(System Clock)。

我们通常关心的是数据处理时间(Process Time),比如进行Time Window操作,对Window的指派就是基于当前Operator所在主机节点的系统时钟。也就是说,每次创建一个Window,计算Window对应的起始时间和结束时间都使用Process Time,它与外部进入的数据元素的事件时间无关。那么,后续作用于Window的操作(Function)都是基于具有Process Time特性的Window进行的。

  • 时间概念指定

    flink中默认使用process time时间概念,如果用户选择使用event time或者ingestion time概念,则需要在创建的StreamExecutionEnvironment中调用setStreamTimeCharacteristic()方法设定系统的时间概念。如下代码所示:

val env = StreamExecutionEnvironment.getExecutionEnvironment()
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)

二、EventTime和Watermark

    流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络延迟等原因,导致乱序的产生,特别是使用kafka的话,多个分区的数据无法保证有序。所以在进行window计算的时候,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了。这个特别的机制,就是watermark,watermark是用于处理乱序事件的。

  • 顺序事件中的Watermarks

    如果数据元素的事件时间是有序的,Watermark时间戳会随着数据元素的时间时间按顺序生成,此时水位线的变化和事件事件保持一直,也就是理想状态下的水位线。当所在算子实例的Watermark时间戳大于窗口结束事件,同时窗口中含有数据元素,此时便会出发对当前窗口的数据计算。如下图所示,事件按照其原本的顺序进入系统中,watermark跟随事件时间之后生成,可以看出watermark其实只是对stream简单的进行周期性地标记,并没有特别大的意义,也就是说在顺序事件的数据处理过程中,watermark并不能发挥太大的价值,反而会因为设定来超期时间而导致延迟输出计算结果。

  • 乱序事件中的Watermarks

    现实情况下数据元素往往并不是按照其生产顺序接入到Flink系统中进行处理,而频繁出现乱序或迟到的情况,这种情况就需要使用Watermarks来应对。如下图所示,事件11和17进入到系统中,Flink系统根据设定的延时值分别计算出w(11)和w(17)这两个Watermarks到达一个Operator中后,便立即调整算子基于事件时间的虚拟时钟与当前的Watermarks的值匹配,然后再触发相应的计算以及输出操作。

  • 并行数据流中的Watermarks

   watermark在Source Operator中生成,并且在每个Source Operator的子Task中都会独立生成watermark。在Source Operator的子任务中生成后就会更新该Task的watermark,且会逐步更新下游算子中的watermark水位线,随后一致保持在该并发之中,直到下一次watermark的生成,并对前面的watermark进行覆盖。多并行度的情况下,watermark对齐会取所有channel最小的watermark

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值