Flink Time
一、概述
对于流式数据处理,最大的特点是数据上具有时间的属性特征,Flink 根据时间产生的
位置不同,将时间区分为三种语义,分别为事件生产时间(Event Time)、事件接入时间
(Ingestion Time)和事件处理时间(Processing Time)
※ Event Time:事件产生的时间,它通常由事件中的时间戳描述
※ Ingestion Time:事件进入 Flink 的时间
※ Processing Time:事件被出来时当前系统的事件
1.时间语义 Time
第一:数据从终端产生,或者从系统中产生的过程中生成的时间为事件生成时间
第二:当数据经过消息中间件传入到 Flink 系统中,在 DataSource 中接入的时候会生成事件接入时间
第三:当数据在 Flink 系统中通过各个算子实例执行转换操作的过程中,算子实例所在系统的时间为数据处理时间
1)设置时间语义
在 Flink 中默认情况下使用 Process Time 时间语义,如果用户选择使用 Event Time 或者 Ingestion Time 语义,
则需要在创建的 StreamExecutionEnvironment 中调用 setStreamTimeCharacteristic() 方法设定系统的时间概念,如下
代码使用 TimeCharacteristic.EventTime 作为系统的时间语义:
// 设 置 使 用 EventTime
streamEnv.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) // 设 置 使 用 IngestionTime
streamEnv.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime)
注意:上面的代码还没有指定具体的时间到底是是上面值,所以后续需要进行设置
2)三个时间的比较
EventTime
1.事件生成时的时间,在进入Flink之前就已经存在,可以从event的字段中抽取。
2.必须指定watermarks(水位线)的生成方式。
3.优势:确定性,乱序、延时、或者数据重放等情况,都能给出正确的结果
4.弱点:处理无序事件时性能和延迟受到影响
IngestTime
1.事件进入flink的时间,即在source里获取的当前系统的时间,后续操作统一使用该时间。
2.不需要指定watermarks的生成方式(自动生成)
3.弱点:不能处理无序事件和延迟数据
ProcessingTime
1.执行操作的机器的当前系统时间(每个算子都不一样)
2.不需要流和机器之间的协调
3.优势:最佳的性能和最低的延迟
4.弱点:不确定性 ,容易受到各种因素影像(event产生的速度、到达flink的速度、在算子之间传输速度等),压根就不管顺序和延迟
比较
性能: ProcessingTime> IngestTime> EventTime
延迟: ProcessingTime< IngestTime< EventTime
确定性: EventTime> IngestTime> ProcessingTime