Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Flink1.4 事件时间与处理时间

Flink1.4 事件时间与处理时间

作者头像
smartsi
发布于 2019-08-07 06:58:27
发布于 2019-08-07 06:58:27
1.7K00
代码可运行
举报
文章被收录于专栏:SmartSiSmartSi
运行总次数:0
代码可运行

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

1. 处理时间

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

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

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

3. 摄入时间

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版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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(...)

备注:

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

备注:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Flink版本:1.4

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
5分钟Flink - 时间语义和Watermark
在 Flink 的流式处理中,绝大部分的业务都会使用 eventTime,一般只在 eventTime 无法使用时,才会被迫使用 ProcessingTime 或者 IngestionTime。
Python编程爱好者
2020/09/08
7140
5分钟Flink - 时间语义和Watermark
Flink系列之时间
一,fink支持的时间 Flink的流式应用支持不同的时间观。 1,处理时间 处理时间是指执行相应操作的机器的系统时间。 当流程序采用处理时间运行时,所有基于时间的操作(如时间窗口)将使用运行各自运算符的机器的系统时钟。例如,每小时处理时间窗口将包括在系统时钟显示一个小时的时间之间到达特定操作之间的所有记录。 处理时间是最简单的时间概念,不需要流和机器之间的协调。它提供最好的性能和最低的延迟。然而,在分布式和异步环境中,处理时间不能提供决定论,因为它易受记录到达系统(例如从消息队列)到达的速度的影响,也与记
Spark学习技巧
2018/01/31
1.8K0
Flink系列之时间
Flink框架中的时间语义和Watermark(数据标记)
“时间”在我们日常的开发学习过程中是特别常见的一个名词,例如:Java中的日期处理类、获取系统的当前时间、毫秒级的时间戳等等。接下来让我们来看看在Flink框架中,对时间不同的概念。Flink框架中有三个时间的语义:事件时间(Event Time )、摄入时间(Ingestion Time)、系统处理时间(Processing Time)。
百思不得小赵
2022/12/01
8370
Flink框架中的时间语义和Watermark(数据标记)
Flink时间语义、Event Time和Watermark机制深度解析
在流处理中,时间是一个非常核心的概念,是整个系统的基石。比如,我们经常会遇到这样的需求:给定一个时间窗口,比如一个小时,统计时间窗口的内数据指标。那如何界定哪些数据将进入这个窗口呢?在窗口的定义之前,首先需要确定一个应用使用什么样的时间语义。
PP鲁
2020/01/14
3.5K0
Flink时间语义、Event Time和Watermark机制深度解析
Flink基于EventTime和WaterMark处理乱序事件和晚到的数据
在实际的业务中,我们经常会遇到数据迟到的情况,这个时候基于窗口进行计算的结果就不对了,Flink中watermark就是为了解决这个问题的,理解watermark之前,先来说一下flink中的三个与流数据相关的概念,ProcessTime、EventTime、IngestionTime,不然很难理解watermark是怎么回事.
王知无-import_bigdata
2019/06/20
3.9K0
Flink基于EventTime和WaterMark处理乱序事件和晚到的数据
Flink基础:时间和水印
本篇终于到了Flink的核心内容:时间与水印。最初接触这个概念是在Spark Structured Streaming中,一直无法理解水印的作用。直到使用了一段时间Flink之后,对实时流处理有了一定的理解,才想清楚其中的缘由。接下来就来介绍下Flink中的时间和水印,以及基于时间特性支持的窗口处理。
用户1154259
2020/11/24
1K0
Flink基础:时间和水印
Flink窗口全解析:三种时间窗口、窗口处理函数使用及案例
我们经常需要在一个时间窗口维度上对数据进行聚合,窗口是流处理应用中经常需要解决的问题。Flink的窗口算子为我们提供了方便易用的API,我们可以将数据流切分成一个个窗口,对窗口内的数据进行处理。本文将介绍如何在Flink上进行窗口的计算。
PP鲁
2020/02/17
7.7K0
Flink窗口全解析:三种时间窗口、窗口处理函数使用及案例
Flink学习——时间概念与Watermark
对于流式处理,最大的特点是数据上具有时间的属性特征,Flink根据时间产生的不同位置分为三个时间概念:
俺也想起舞
2021/03/18
2.7K0
Flink最难知识点再解析 | 时间/窗口/水印/迟到数据处理
时间、窗口、水印、迟到数据这四个知识点几乎是Flink这个框架最难点。我之前发了很多文章来解释。很多同学仍然理解不了。
王知无-import_bigdata
2020/02/24
5.1K3
Flink 中极其重要的 Time 与 Window 详细解析(深度好文,建议收藏)
流式:就是数据源源不断的流进来,也就是数据没有边界,但是我们计算的时候必须在一个有边界的范围内进行,所以这里面就有一个问题,边界怎么确定? 无非就两种方式,根据时间段或者数据量进行确定,根据时间段就是每隔多长时间就划分一个边界,根据数据量就是每来多少条数据划分一个边界,Flink 中就是这么划分边界的,本文会详细讲解。
五分钟学大数据
2021/01/25
1.5K0
Flink 中极其重要的 Time 与 Window 详细解析(深度好文,建议收藏)
2021年最新最全Flink系列教程__Flink高级API(四)
并添加Watermark来解决一定程度上的数据延迟和数据乱序(最多延时 3 秒)问题。
Maynor
2021/12/07
3400
2021年最新最全Flink系列教程__Flink高级API(四)
快速入门Flink (10) —— DataStream API 开发之【EventTime 与 Window】
在上一篇博客中,博主已经为大家介绍了DataStream API 开发之【Time 与 Window】,并着重介绍了常用的 Window API 。本篇博客,我们就趁热打铁,继续接下去讲, DataStream API 开发之【EventTime 与 Window】。
大数据梦想家
2021/01/27
7090
快速入门Flink (10) —— DataStream API 开发之【EventTime 与 Window】
一网打尽Flink中的时间、窗口和流Join
首先,我们会学习如何定义时间属性,时间戳和水位线。然后我们将会学习底层操作process function,它可以让我们访问时间戳和水位线,以及注册定时器事件。接下来,我们将会使用Flink的window API,它提供了通常使用的各种窗口类型的内置实现。我们将会学到如何进行用户自定义窗口操作符,以及窗口的核心功能:assigners(分配器)、triggers(触发器)和evictors(清理器)。最后,我们将讨论如何基于时间来做流的联结查询,以及处理迟到事件的策略。
王知无-import_bigdata
2021/09/22
1.9K0
Flink1.4 生成时间戳与Watermarks
本节适用于在事件时间上运行的程序。有关事件时间,处理时间和提取时间的介绍,请参阅Flink1.4 事件时间与处理时间。
smartsi
2019/08/07
2.2K0
聊聊flink的TimeCharacteristic
flink-streaming-java_2.11-1.7.0-sources.jar!/org/apache/flink/streaming/api/TimeCharacteristic.java
code4it
2018/12/18
3.6K0
聊聊flink的TimeCharacteristic
[白话解析] Flink的Watermark机制
对于Flink来说,Watermark是个很难绕过去的概念。本文将从整体的思路上来说,运用感性直觉的思考来帮大家梳理Watermark概念。
罗西的思考
2020/09/07
5.7K1
Flink实战(七) - Time & Windows编程
掌握Flink中三种常用的Time处理方式,掌握Flink中滚动窗口以及滑动窗口的使用,了解Flink中的watermark。
JavaEdge
2019/07/23
9280
Flink实战(七) - Time & Windows编程
2021年大数据Flink(二十三):​​​​​​​Watermaker案例演示
注意:一般我们都是直接使用Flink提供好的BoundedOutOfOrdernessTimestampExtractor
Lansonli
2021/10/09
7840
彻底搞清Flink中的Window(Flink版本1.8)
在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们的网页。在这种情况下,我们必须定义一个窗口,用来收集最近一分钟内的数据,并对这个窗口内的数据进行计算。
create17
2021/04/07
1.5K0
彻底搞清Flink中的Window(Flink版本1.8)
Flink双流及多流Join 、IntervalJoin、coGroupJoin的区别与生产使用
1.Flink 三种Join的代码测试 1.1 数据源 1.2 join 1.3 intervalJoin 1.3.1 intervalJoin API用法 1.3.2 intervalJoin SQL用法 1.4 coGroup
大数据真好玩
2022/12/05
3.2K0
Flink双流及多流Join 、IntervalJoin、coGroupJoin的区别与生产使用
推荐阅读
相关推荐
5分钟Flink - 时间语义和Watermark
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验