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

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

  1. [Flink]Flink1.3 Stream指南七 理解事件时间与Watermarks

    Flink实现了数据流模型(Dataflow Model)中许多技术.如果想对事件时间(event time)和水位线(watermarks)更详细的了解,请参阅下面的文章: The world be ...

  2. flink DataStream API(三)事件时间-生成水印

    文章目录 生成水印 水印策略介绍 使用水印策略 处理空闲源 编写 `WatermarkGenerators` 编写周期 WatermarkGenerator 编写标点WatermarkGenerato ...

  3. 什么是事件时间和处理时间?

    写在前面 本文隶属于专栏<100个问题搞定大数据理论体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定大数据理 ...

  4. iceberg-flink 十:flink 窗口,事件时间,处理时间。

    flink窗口 窗口的开始和结束的时间,是按照服务器当前的时间进行统计的.比如,当前时间为 2023-03-28 16:23 按照五分钟进行开窗.那么当前的开窗就是 2023-03-28 16:20 ...

  5. flink DataStream API(三)事件时间-内置水印生成器

    文章目录 内置水印生成器 单调递增的时间戳 固定的延迟时间 内置水印生成器 如生成水印中所述,Flink提供了抽象,允许程序员分配他们自己的时间戳并发出他们自己的水印.更具体地说,可以通过实现Wate ...

  6. Flink时间【事件时间、摄取时间、处理时间】与水印概述

    一.事件时间 事件时间是每个事件在其生产者上创建的时间. 该时间通常在它们进入Flink之前嵌入到记录中,并且可以从每个记录中提取事件时间戳.在事件时间中,时间的进度取决于数据,而不取决于任何时钟.事 ...

  7. Flink事件时间、水印以及迟到数据处理的个人理解

    Flink中的时间概念 Flink在流式传输程序中支持不同的时间概念: ProcessingTime: 处理时间,正在执行操作的机器的时间 EventTime: 事件时间,事件发生的时间 Ingest ...

  8. 事件时间/处理时间/进入时间(Event Time / Processing Time / Ingestion Time)

    Flink在流处理程序中支持不同的时间概念. 处理时间(processing time):处理时间是指执行相应操作的机器的系统时间. 当流处理程序基于处理时间运行时,所有基于时间的操作(如时间窗口)将 ...

  9. flink 不设置水印_Flink基础:时间和水印

    ​ 往期推荐: 本篇终于到了Flink的核心内容:时间与水印.最初接触这个概念是在Spark Structured Streaming中,一直无法理解水印的作用.直到使用了一段时间Flink之后,对实 ...

最新文章

  1. Postman 最被低估的功能!
  2. Spark-ML-数据获取/处理/准备
  3. 程序设计囚犯与灯泡 C语言代码,100个囚犯和灯泡的那些事儿(下)
  4. EMNLP 2020 | 基于Wasserstein距离的正则化序列表示
  5. 浙大提出会打德扑的「自我博弈」AI,还会玩射击游戏
  6. nginx 去掉服务器版本和名称和nginx_status 状态说明
  7. Sklearn参数详解—聚类算法
  8. jdk只有一个java进程_JDK 10:从Java访问Java应用程序的进程ID
  9. c# uri.host_C#| Uri.IsHexEncoding()方法与示例
  10. debian 升级linux内核,Debian8升级内核到4.5
  11. mysql 常见密码设置_设置mysql用户密码(5.6/5.7)、远程连接数据库、常用命令
  12. 通过自己的项目实际经验,阐述为什么“恶心玩技术”?玩Java开源B/S的教训(三)...
  13. Android浏览图片,点击放大至全屏效果
  14. 什么图用什么工具画?
  15. diy gps for mio 686
  16. SQL Server 2008 允许远程连接的解决方法
  17. MAC PHP集成环境安装MAMP
  18. 农夫山泉启示录:零售价2块钱的水,水值2分钱【姜太公公】
  19. 企业中爬虫问题(来自网易公开课)
  20. Android开发学习之Intent具体解释

热门文章

  1. boost::geometry::model::box用法的测试程序
  2. boost::fibers::algo::shared_work >用法的测试程序
  3. boost::endian模块宏BOOST_SCOPED_ENUM的测试程序
  4. GDCM:MrProtocol的测试程序
  5. boost::pointer_traits用法实例
  6. Boost:自动索引允许的选项
  7. ITK:将颜色贴图应用于图像
  8. ITK:计算曲率各向异性扩散
  9. Qt Creator将应用程序部署到QNX Neutrino设备
  10. Qt Creator设置3D组件属性