Flink 的 窗口和时间类型

窗口运算

流式计算是一种被设计用于处理无限数据集的数据计算引擎,所谓无限数据集是指一种源源不断的数据流抽象成的集合。
而Window就是一种将无限数据集切分成多个有限数据集并对每一个有限数据集分别进行处理的手段。

Window本质上是将数据流按照一定的规则,逻辑地切分成很多个有限大小的“bucket”桶,这样就可以对每一个在“桶里面”的有限的数据依次地进行计算了。

流式计算引擎的特点是每输入一条数据就立即处理,延迟低。然而在一些场景下偏偏希望将数据先攒成一个个小批次,然后对每一个小批次再进行运算。例如用FlinkDataStream API将数据进行实时的聚合后,再将结果实时的写入到数据库,每输入一条数据都会输出一个聚合后的结果,如果数据量非常大,那么对外部的数据库的写入压力就比较大。而划分成Window,即将每一个Window中的有限的数据先聚合成一条或几条,再写入到数据库中,虽然延迟变高了,但是对数据库的写入压力变小了。Window操作可以认为是微批次准实时的计算,这样Flink

DataStream API 既可以实现高效的实时运算,又可以实现微批次的准实时运算,让Flink在实时计算领域更加强大和灵活。

时间类型

Flink实时计算划分窗口时,如果使用时间作为划分窗口的依据,时间有不同的类型,分为

Event Time、 Ingestion Time、 Processing Time。

Flink默认使用的是 Processing Time,程序运行如果使用不同的时间类型,计算的结果完全不同,可以根据实际需求选择使用具体哪一种时间类型。

Event Time 事件时间**
(产生数据时候的时间)**

在大数据领域,日志服务器生成的一条数据也可以称为一个事件。Event Time是指在数据产生时该设备上对应的时间,这个时间在进入Flink之前已经存在于数据记录中了。以后数据被Flink处理数据,如果使用Event Time作为时间标准,那么数据并不是按照Event Time的先后顺序被处理的,由于数据可能产生在多个不同的日志服务器,然后通常是再将数据写入到分布性消息中间件,然后被被Flink拉取进行处理时,处理的实际时间相对于数据产生的实际肯定有一定的延迟,并且Event Time可能也是乱序的。那么为什么还要使用Event Time呢?是因为使用Event Time时,Flink程序可以处理乱序事件和延迟数据。并且最重要的功能就是可以统计在数据产生时,对应时间的数据指标。

Ingestion Time 进入时间
(被我们 Source 读取过来 对应的时间)

Ingestion Time指的是事件数据进入到Flink的时间。每条数据的Ingestion Time就是进入到Source Operator时所在机器的系统时间。比如Flink从Kafka消息中间件消费数据,每一条数据的Ingestion Time就是FlinkKafkaConsumer拉取数据进入到TaskManager对应的时间。Ingestion Time介于Event Time和Processing Time之间,与 Event Time 相比,Ingestion Time程序无法处理任何无序事件或延迟数据,并且程序不必指定如何生成水,Flink会自动分配时间戳和自动生成水位线。

Processing Time 处理时间

(被我们的算子计算的时候对应的时间)

Processing Time是指事件数据被Operator处理时所在机器的系统时间,是Flink默认使用的时间标准,它提供了最好的性能和最低的延迟。但是,Flink是一个在分布式的计算框架,数据从产生到被处理会有一定的延迟(例如从消息队列拉取数据到Source,Source再到处理的Operator会有一定的延迟),所以Processing Time无法精准的体现出数据在产生的那个时刻的变化情况。

Flink窗口的分类

Flink的Window可以分成两类:

GlobalWindow:按照指定的数据条数生成一个Window,与时间无关。(按条数划分)

TimeWindow:按照时间生成Window,可以根据窗口实现原理的不同分成三类:
滚动窗口(Tumbling Window)、
滑动窗口(Sliding Window)
会话窗口(Session Window)

滚动窗口(Tumbling Windows)

将数据依据固定的窗口⻓度对数据进行切片。特点:时间对⻬,窗口⻓度固定,没有重叠。

滑动窗口(Sliding Windows)

滑动窗口是固定窗口的更广义的一种形式,滑动窗口由固定的窗口⻓度和滑动间隔组成。 特点:时间对⻬,窗口⻓度固定,有重叠。

滑动窗口分配器将元素分配到固定⻓度的窗口中,与滚动窗口类似,窗口的大小由窗口大小参数来配置,另一个窗口滑动参数控制滑动窗口开始的频率。因此,滑动窗口如果滑动参数小于窗口大小的话,窗口是可以重叠的,在这种情况下元素会被分配到多个窗口中。

会话窗口(Session Windows)

由一系列事件组合一个指定时间⻓度的timeout间隙组成,类似于web应用的session,也就是一段时间没有接收到新数据就会生成新的窗口。

窗口又分为
Non-Keyed 和 Keyed Windows

Non-Keyed 不分组的

  • Non-keyed Window,
    window和window function所在的DataStream 并行度为 1
    底层调用windowAll(Window Assinger) 并行度为 1

Keyed Windows 分组的

  • keyed Window,
    window和window function所在的DataStream并行度为可以是多个
    底层调用windowAll(Window Assinger) 并行度为 1

聚合的话 又分为

全量聚合 都加载完一起计算数据

增量聚合 来一条数据算一条数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值