[Flink]Flink1.3 Stream指南六 事件时间与处理时间

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: Flink在数据流中支持几种不同概念的时间。1. 处理时间 Processing TimeProcessing Time(处理时间)是指执行相应操作机器的系统时间(Processing time refers to the system time of the machine that is executing the respective operation.)。

Flink在数据流中支持几种不同概念的时间。

1. 处理时间 Processing Time

Processing Time(处理时间)是指执行相应操作机器的系统时间(Processing time refers to the system time of the machine that is executing the respective operation.)。

当一个流程序以处理时间来运行时,所有基于时间的操作(如: 时间窗口)将使用运行相应算子(operator)所在机器的系统时间。例如:一个按处理时间每小时进行处理的时间窗口将包括所有的记录,其按系统时钟一小时内到达指定算子(an hourly processing time window will include all records that arrived at a specific operator between the times when the system clock indicated the full hour.)。

处理时间是最简单的一个时间概念,不需要在数据流和机器之间进行协调。它有最好的性能和最低的延迟。然而,在分布式或者异步环境中,处理时间具有不确定性,因为容易受到记录到达系统速度的影响(例如从消息队列到达的记录),还会受到系统内记录流在不同算子之间的流动速度的影响(speed at which records arrive in the system, and to the speed at which the records flow between operators inside the system)。

2. 事件时间 Event Time

Event Time(事件时间)是每个独立事件在它生产设备上产生的时间。在进入Flink之前,事件时间通常要嵌入到记录中,并且事件时间也可以从记录中提取出来。一个按事件时间每小时进行处理的时间窗口将包含所有的记录,其事件时间都在这一小时之内,不管它们何时到达,以及它们以什么顺序到达。

事件时间即使在乱序事件,延迟事件以及从备份或持久化日志中的重复数据也能获得正确的结果。对于事件时间,时间的进度取决于数据,而不是任何时钟。事件时间程序必须指定如何生成事件时间的Watermarks,这是表示事件时间进度的机制。

按事件时间处理往往会导致一定的延迟,因为它要等待延迟事件和无序事件一段时间。因此,事件时间程序通常与处理时间操作相结合使用。

3. 提取时间 Ingestion Time

Ingestion Time是事件进入Flink的时间。在source operator中,每个记录将源的当前时间记为时间戳,基于时间的操作(如时间窗口)会使用该时间戳。

提取时间概念上处在事件时间和处理时间之间。与处理时间相比,提取时间的成本稍微更高一些,但是可以提供更可预测的结果。因为提取时间的时间戳比较稳定(在源处只记录一次),同一数据在流经不同窗口操作时将使用相同的时间戳,而对于处理时间,每个窗口算子可能将记录分配给不同的窗口(基于本地系统时钟以及传输延迟)。

与事件时间相比,提取时间程序无法处理任何无序事件或延迟事件,但程序不必指定如何生成watermarks。

在内部,提取时间与事件时间非常相似,但事件时间会自动分配时间戳以及自动生成watermark(with automatic timestamp assignment and automatic watermark generation)。

4. 设定时间特性

Flink DataStream程序的第一部分通常设置基本的时间特性(base time characteristic)。该设置定义数据流源的行为方式(例如,它们是否产生时间戳),以及窗口操作如KeyedStream.timeWindow(Time.seconds(30))应使用哪一类型时间,是事件时间还是处理时间等。

以下示例展示了一个按每小时处理的时间窗口聚合事件的Flink程序。窗口的行为会与时间特性相匹配。

Java版本:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);

// alternatively:
// env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime);
// env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);

DataStream<MyEvent> stream = env.addSource(new FlinkKafkaConsumer09<MyEvent>(topic, schema, props));

stream
    .keyBy( (event) -> event.getUser() )
    .timeWindow(Time.hours(1))
    .reduce( (a, b) -> a.add(b) )
    .addSink(...);

Scala版本:

val env = StreamExecutionEnvironment.getExecutionEnvironment

env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime)

// alternatively:
// env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime)
// env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)

val stream: DataStream[MyEvent] = env.addSource(new FlinkKafkaConsumer09[MyEvent](topic, schema, props))

stream
    .keyBy( _.getUser )
    .timeWindow(Time.hours(1))
    .reduce( (a, b) => a.add(b) )
    .addSink(...)

备注:

为了以事件时间中运行此示例,程序需要使用定义了事件时间并自动产生watermarks的源,或者程序必须在源之后设置时间戳分配器和watermarks生成器。上述函数描述了如何获取事件时间戳,以及展现事件流的无序程度。

备注:

Flink版本:1.3

原文:https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/event_time.html#event-time--processing-time--ingestion-time

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
5月前
|
流计算
Flink 多个stream合并聚合
Flink 多个stream合并聚合
44 0
Flink 多个stream合并聚合
|
7月前
|
程序员 API 数据安全/隐私保护
Flink--8、时间语义、水位线(事件和窗口、水位线和窗口的工作原理、生产水位线、水位线的传递、迟到数据的处理)
Flink--8、时间语义、水位线(事件和窗口、水位线和窗口的工作原理、生产水位线、水位线的传递、迟到数据的处理)
|
2月前
|
定位技术 流计算
在Flink CEP中,可以通过定义带有时间约束的模式来匹配事件的持续时间
【2月更文挑战第12天】在Flink CEP中,可以通过定义带有时间约束的模式来匹配事件的持续时间
36 3
|
3月前
|
SQL 消息中间件 Apache
flink问题之cep超时事件如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
42 1
|
4月前
|
SQL Java 流计算
Flink 中支持的事件时间属性数据类型必须为 TIMESTAMP
【1月更文挑战第19天】【1月更文挑战第95篇】Flink 中支持的事件时间属性数据类型必须为 TIMESTAMP
48 2
|
4月前
|
监控 Java 流计算
Flink中的事件时间和处理时间有什么区别?为什么事件时间在流计算中很重要?
Flink中的事件时间和处理时间有什么区别?为什么事件时间在流计算中很重要?
32 0
|
4月前
|
SQL 自然语言处理 机器人
Flink sql滚动窗口怎么操作能实现stream里的allowlateness?
【1月更文挑战第3天】【1月更文挑战第12篇】Flink sql滚动窗口怎么操作能实现stream里的allowlateness?
55 1
|
5月前
|
缓存 关系型数据库 MySQL
这个错误提示表明Flink CDC在解析MySQL的二进制日志时,找不到对应表的TableMap事件。
这个错误提示表明Flink CDC在解析MySQL的二进制日志时,找不到对应表的TableMap事件。
146 2
|
5月前
|
数据库 流计算
Flink CDC的工作原理是通过监听数据库的变更事件
Flink CDC的工作原理是通过监听数据库的变更事件
57 1
|
传感器 存储 SQL
Flink多流转换(Flink Stream Unoin、Flink Stream Connect、Flink Stream Window Join)
Flink多流转换(Flink Stream Unoin、Flink Stream Connect、Flink Stream Window Join)
Flink多流转换(Flink Stream Unoin、Flink Stream Connect、Flink Stream Window Join)