欢迎光临散文网 会员登陆 & 注册

Flink 时间窗口全解析!(建议收藏)

2023-07-27 10:36 作者:ingemar-  | 我要投稿

我们抛开计数窗口,先看时间窗口

对于时间窗口最主要的就是时间,比如1分钟的窗口长度,那么这个1分钟是如何定义呢?

Flink中针对时间有3种类型

  • EventTime[事件时间]

事件发生的时间,例如:点击网站上的某个链接的时间

  • IngestionTime[摄入时间]

某个Flink节点的source operator接收到数据的时间,例如:某个source消费到kafka中的数据

  • ProcessingTime[处理时间]

某个Flink节点执行某个operation的时间,例如:timeWindow接收到数据的时间


  • 事件时间 event time

事件真实发生的时间。Flink1.12版本起默认事件时间

  • 处理时间 process time

Flink处理start-log中这条数据时的设备时间。Flink1.12之前默认处理时间

Flink1.12版本之前,如何指定为事件时间呢?


EventTime

在大数据领域,日志服务器生成的一条数据也可以称为一个事件。EventTime是指在数据产生时该设备上对应的时间,这个时间在进入Flink之前已经存在于数据记录中了。

以后数据被Flink处理数据,如果使用EventTime作为时间标准,那么数据并不是按照EventTime的先后顺序被处理的,由于数据可能产生在多个不同的日志服务器,然后通常是再将数据写入到分布性消息中间件,然后被被Flink拉取进行处理时,处理的实际时间相对于数据产生的实际肯定有一定的延迟,并且EventTime可能也是乱序的。

那么为什么还要使用EventTime呢?

是因为使用EventTime时,Flink程序可以处理乱序事件和延迟数据。并且最重要的功能就是可以统计在数据产生时,对应时间的数据指标。

总之,使用EventTime的优势是结果的可预测性,缺点是缓存较大,增加了延迟,且调试和定位问题更复杂。


ProcessingTime


ProcessingTime是指事件数据被Operator处理时所在机器的系统时间,它提供了最好的性能和最低的延迟。

但是,Flink是一个在分布式的计算框架,数据从产生到被处理会有一定的延迟(例如从消息队列拉取数据到Source,Source再到处理的Operator会有一定的延迟),所以ProcessingTime无法精准的体现出数据在产生的那个时刻的变化情况。


IngestionTime


IngestionTime指的是事件数据进入到Flink的时间。每条数据的IngestionTime就是进入到SourceOperator时所在机器的系统时间。比如Flink从Kafka消息中间件消费数据,每一条数据的IngestionTime就是FlinkKafkaConsumer拉取数据进入到TaskManager对应的时间。

IngestionTime介于EventTime和ProcessingTime之间,与EventTime相比,IngestionTime程序无法处理任何无序事件或延迟数据,并且程序不必指定如何生成水,Flink会自动分配时间戳和自动生成水位线。


Flink 时间窗口全解析!(建议收藏)的评论 (共 条)

分享到微博请遵守国家法律