概念
在flink中定义了三类时间:
- Event Time 是事件在现实世界中发生的时间,它通常由事件中的时间戳描述。
- Ingestion Time 是数据进入Apache Flink流处理系统的时间,也就是Flink读取数据源时间。
- Processing Time 是数据流入到具体某个算子 (消息被计算处理) 时候相应的系统时间。也就是Flink程序处理该事件时当前系统时间。
详解
假设原始日志如下:
2020-07-10 10:00:01,134 INFO user1 - pv - shopA
- 事件时间
定义:事件时间就是事件在真实世界的发生时间,即每个事件在产生它的设备上发生的时间(当地时间)。比如一个点击事件的时间发生时间,是用户点击操作所在的手机或电脑的时间。如这条日志的事件时间就是这条原始日志上自带的时间 2020-07-10 10:00:01,134。
本质:在进入Apache Flink框架之前EventTime通常要嵌入到记录中,并且EventTime也可以从记录中提取出来。在实际的网上购物订单等业务场景中,大多会使用EventTime来进行数据计算。
优缺点 :基于事件时间处理的强大之处在于即使在乱序事件,延迟事件,历史数据以及从备份或持久化日志中的重复数据也能获得正确的结果。对于事件时间,时间的进度取决于数据,而不是任何时钟。事件时间程序必须指定如何生成事件时间的Watermarks,这是表示事件时间进度的机制。
-
进入时间
定义: IngestionTime是数据进入Apache Flink框架的时间,是在Source Operator中设置的。每个记录将源的当前时间作为时间戳,并且后续基于时间的操作(如时间窗口)引用该时间戳。假设这条数据进入Flink的时间是 : 2020-07-10 20:00:01,134,那么IngestionTime就是这个时间
本质: 提取时间在概念上位于事件时间和处理时间之间。与处理时间相比,它稍早一些。提取时间与事件时间非常相似,都具有自动时间戳分配和自动水位线生成功能。
优缺点 :IngestionTime与ProcessingTime相比可以提供更可预测的结果,因为IngestionTime的时间戳比较稳定(在源处只记录一次),所以同一数据在流经不同窗口操作时将使用相同的时间戳,而对于ProcessingTime同一数据在流经不同窗口算子会有不同的处理时间戳。
与eventtime相比,提取时间程序无法处理任何无序事件或后期数据,但程序不必指定如何生成水位线。 -
处理时间
定义: 他是数据流入到具体某个算子时候相应的系统时间,如这条日志到达Window处理的时间是 : 2020-07-10 20:10:01,134。
本质: 这个系统时间指的是执行相应操作的机器的系统时间。当一个流程序通过处理时间来运行时,所有基于时间的操作(如: 时间窗口)将使用各自操作所在的物理机的系统时间。
优缺点 : ProcessingTime 有最好的性能和最低的延迟。但在分布式计算环境或者异步环境中,ProcessingTime具有不确定性,相同数据流多次运行有可能产生不同的计算结果。因为它容易受到从记录到达系统的速度(例如从消息队列)到记录在系统内的operator之间流动的速度的影响(停电,调度或其他)。
假如需要统计mou ge使用数据进入Flink的时间或者Window处理的时间,其实是没有意义的,此时使用原始日志中的时间才是有意义的,那才是数据产生的时间
代码使用
val env = StreamExecutionEnvironment.getExecutionEnvironment
// 从调用时刻开始给env创建的每一个stream追加时间特征
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime)
env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime)
网友评论