熟悉flink的同学(说明次系列篇幅不适合没有flink基础同学)都知道flink优于其他实时计算引擎的一个很重要的特点就是提供了Event Time这样一个概念,也就是我们所说的事件时间,能够让用户按照事件(数据)所发生的时间去处理,从而精确还原数据场景。flink 中提供了三种时间概念:处理时间、事件时间、注入时间,在次系列篇幅中主要分析在实际使用中用户常常关心的处理时间与事件时间,以及在flink runtime中是如何处理这两种时间机制的,将会按照以下几个篇幅介绍:
一、时间系统概述介绍
二、Processing Time源码分析
三、Event Time源码分析
四、时间系统在窗口函数中的应用分析
五、ProcessFunction 使用分析
六、实例讲解:如何做定时输出
次篇幅将会介绍flink 中时间系统的一些简单介绍。先奉上时间分类一张经典的图片
image
Event Time
Event Time 是事件发生的时间,一般就是数据本身携带的时间。这个时间通常是在事件到达 Flink 之前就确定的,并且可以从每个事件中获取到事件时间戳,从另外一个角度说明,由于其事件时间属性不会改变,那么使用Event Time 处理数据在任何时候处理得到的结果应该是一样的。在 Event Time 中,时间取决于数据,而跟其他没什么关系。Event Time 程序必须指定如何生成 Event Time 水印,这是表示 Event Time 进度的机制。
Processing Time
Processing Time 是指事件被处理时机器的系统时间。当流程序在 Processing Time 上运行时,所有基于时间的操作(如时间窗口)将使用当时机器的系统时间。每小时 Processing Time 窗口将包括在系统时钟指示整个小时之间到达特定操作的所有事件。
Ingestion Time
Ingestion Time 是事件进入 Flink 的时间。在源操作处,每个事件将源的当前时间作为时间戳,并且基于时间的操作(如时间窗口)会利用这个时间戳。Ingestion Time 在概念上位于 Event Time 和 Processing Time 之间,其没法处理延时或者数据乱序。
flink中checkpoint 定时执行、watermark的定时生成、processFunction注册定时触发定时器、time window 函数定时触发都与时间相关。
a:checkpoint 定时触发是在jobMaster端的CheckpointCoordinator 定时生成checkpoint barrier 注入到source中,这里的时间是Processing Time,通过ScheduledThreadPoolExecutor来做定时生成;
b: watermark用来衡量事件时间中当前事件的处理进度,本质上也是一个时间戳,会在source端或者通过assignTimestampsAndWatermarks 方式来定时生成,通过flink的processing time system来实现;
c: ProcessFunction 在官方文档上已经有比较详细的介绍,可以操作状态、访问当前时间、注册定时器,在flink 中是一个low level api,用来完成一些比较复杂的逻辑处理,通过registerProcessingTimeTimer 、registerEventTimeTimer 方式注册处理时间定时器、事件时间定时器,底层通过flink time system 来实现;
d: time 类型的window 可分为处理时间窗口与事件时间窗口,处理时间窗口的触发与当前执行窗口操作的机器有关,当前机器时间达到窗口 endTime就会执行窗口函数,事件时间窗口的触发与当前watermark有关,当前watermark大于等于窗口endTime 就会执行窗口函数,底层同样通过 flink time system 来实现。
以上关于flink 时间的简要介绍,欢迎跟进阅读~
网友评论