Flink Time

时间:2020-06-10
本文章向大家介绍Flink Time,主要包括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

原文地址:https://www.cnblogs.com/alen-apple/p/13083775.html