Flink内核原理与实现
上QQ阅读APP看书,第一时间看更新

4.1 时间类型

在Flink中定义了3种时间类型:事件时间(Event Time)、处理时间(Processing Time)和摄取时间(Ingestion Time)。

3种时间类型如图4-1所示。

图4-1 3种时间类型

(1)事件时间

事件时间指事件发生时的时间,一旦确定之后再也不会改变。例如,事件被记录在日志文件中,日志中记录的时间戳就是事件时间。通过事件时间能够还原出来事件发生的顺序。

使用事件时间的好处是不依赖操作系统的时钟,无论执行多少次,可以保证计算结果是一样的,但计算逻辑稍微复杂,需要从每一条记录中提取时间戳。

(2)处理时间

处理时间指消息被计算引擎处理的时间,以各个计算节点的本地时间为准。例如,在物理节点1处理时,处理时间(即当前系统时间)为2019-02-05 12∶00∶00,然后交给下游的计算节点进程处理,此时的处理时间(即当前系统时间)为2019-02-05 12∶00∶01。可以看到处理时间是在不停变化的。使用处理时间依赖于操作系统的时钟,重复执行基于窗口的统计作业,结果可能是不同的。处理时间的计算逻辑非常简单,性能好于事件时间,延迟低于事件时间,只需要获取当前系统的时间戳即可。

(3)摄取时间

摄取时间指事件进入流处理系统的时间,对于与一个事件来说,使用其被读取的那一刻的时间戳作作为摄取时间。

摄取时间一般使用得较少,从处理机制上来说,其类似于事件时间,在作业异常重启执行的时候,也无法避免使用处理时间的结果不准确的问题。一般来说,若在数据记录中没有记录时间,又想使用事件时间机制来处理记录,会选择使用摄取时间。

在Flink应用中可以使用这3种时间类型,其中最常用的是事件时间和处理时间,如代码清单4-1所示。

代码清单4-1 使用TimeCharacteristic设置Flink使用的时间类型