flink 时间概念和waterMark

flink中的时间概念

理解waterMark,还需要先理解flink的时间概念

时间分为

  • 事件时间eventTime:事件发生的时间,一般就是数据本身携带的时间。
  • 摄入时间IngestionTime:事件进入Flink的时间。
  • 处理时间processTime:事件被处理的时间,也就是由机器的系统时间来决定。

处理时间是最简单的时间概念,不需要流与机器之间的协调。即我机器收到数据后就将其放入时间窗口进行处理,类似将其转化成一个以时间为界的批处理任务之中。也就是把流抽象成批处理,只是批处理的数据大小由固定时间内收到的数据的数量来决定。

事件时间和水位线

事件时间程序必须指定如何生成waterMark,这是机器指示时间进度的工具,即可以按照数据发生的真正时间来处理数据。

在事件时间场景下,Flink 支持waterMark按事件时间处理可能的延迟和乱序事件。水印的作用:告知算子之后不会有小于或等于waterMark时间戳的事件

分配时间戳与waterMark的两种方法
1、直接在数据之中指定:在source中,直接生成watermark,由source生成的watermark 优先级比较低,可以被另一个方法产生的watermark覆盖掉。

2、实现时间戳和waterMark生成器(ps:时间戳和waterMark是从1970-01-01T00:00:00至今的毫秒数):通过时间戳分配器(timestamp assigner)来生成水位线(watermark)。

  • 时间戳分配器分两种:Periodic:
    • 周期性(一定时间间隔或一定数据量)产生watermark;
    • Punctuated: 间断的 watermark,一般根据event 决定是否产生新watermark。

EventTime和waterMark(摘自http://wuchong.me/blog/2018/11/18/flink-tips-watermarks-in-apache-flink-made-easy/

系统处理数据是的默认时间为processTime,要手动定义处理的时间特征:

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)  

最佳实践是在尽可能靠近数据源甚至在 SourceFuntion 分配时间戳和生产水印。

Flink 提供了两个预定义实现类:

  • AscendingTimestampExtractor 适用于时间戳递增的情况
  • BoundedOutOfOrdernessTimestampExtractor 适用于乱序但最大延迟已知的情况

设置时间特征为事件时间的流处理器需要一种方法来衡量事件时间的进度,Flink衡量event time 进度的机制是watermarks,watermark 带有一个时间戳,作为数据流的一部分随数据流流动,Watermark(t) 表示event time 小于等于 t 的都已经到达,watermarks可以解决实时系统中最常见的问题:乱序与延迟。

举例:有一个带有时间戳的事件流,但是由于某种原因它们并不是按顺序到达的。图中的数字代表事件发生的时间戳。第一个到达的事件发生在时间 4,然后它后面跟着的是发生在更早时间(时间 2)的事件,以此类推:

                 

注意这是一个按照事件时间处理的例子,这意味着时间戳反映的是事件发生的时间,而不是处理事件的时间。事件时间(Event-Time)处理的强大之处在于,无论是在处理实时的数据还是重新处理历史的数据,基于事件时间创建的流计算应用都能保证结果是一样的。

假设创建一个流计算排序算子。也就是处理一个乱序到达的事件流,并按照事件时间的顺序输出事件。(有缓存就必然有延迟),我们需要的是某种策略,它定义了对于任何带时间戳的事件流,何时停止等待更早数据的到来。这正是 watermark 的作用,他们定义了何时不再等待更早的数据。

Flink 中的事件时间处理依赖于一种特殊的带时间戳的元素,成为 watermark,它们会由数据源或是 watermark 生成器插入数据流中。具有时间戳 t 的 watermark 可以被理解为断言了所有时间戳小于或等于 t 的事件都(在某种合理的概率上)已经到达了。(flink源码采用了小于或等于的机制)

我们可以设想不同的策略来生成 watermark。

每个事件都会延迟一段时间才到达,而这些延迟差异会比较大,所以有些事件会比其他事件延迟更多。一种简单的方法是假设这些延迟不会超过某个最大值。Flink 把这种策略称作 “有界无序生成策略”(bounded-out-of-orderness)。当然也有很多更复杂的方式去生成 watermark,但是对于大多数应用来说,固定延迟的方式已经足够了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值