Flink原理学习窗口和时间
Posted oahaijgnahz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flink原理学习窗口和时间相关的知识,希望对你有一定的参考价值。
Flink原理学习之 窗口和时间
文章目录
一、Flink的时间类型
Flink的时间语义分为三种:
- Event Time:即事件时间,是事件真正发生的时间,一旦确定就不会发生变化。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink通过时间戳分配器访问事件时间戳。
- Processing Time:即处理时间,是每一个执行基于时间操作的算子的本地系统时间,与机器相关,因此多次执行结果会不同,默认的时间属性就是Processing Time。
- Ingestion Time:即摄取时间,是数据进入Flink的时间。摄取时间也无法避免Flink异常重启后数据处理的不准确问题。
一般来说Event Time才是事件真正的时间,也是Flink最大的特点之一,一般业务都是使用事件时间。像Processing Time,会产生多次计算结果不同的问题,也会因为数据延迟到达服务端而产生统计不准确的问题(Spark Streaming就是使用Processing Time)。
二、Watermark
Watermark用于在EventTime下处理乱序事件,而正确处理乱序事件,通常通过Watermark和窗口来实现。乱序是由于网络、分布式等原因产生的,而乱序不经处理则会影响窗口数据统计的准确性。
Watermark也可以理解成一个延迟触发机制,我们可以设置Watermark的延时时长t
,每次系统会校验已经到达的数据中最大的maxEventTime,然后认定eventTime小于maxEventTime - t的所有数据都已经到达(实际是否真到了并不知道),如果有窗口的停止时间等于maxEventTime – t
,那么这个窗口被触发执行。
Watermark是Source通过一定策略(分为两种一种是周期性插入,另一种是每个事件都计算Watermark,一般选择周期性)插入数据流并向下传递的。Watermark = maxEventTime - 最大延迟时间
,一旦Watermark大于窗口结束时间,触发窗口计算的执行。由此可见,Watermark在数据流中是非减的。而如果出现Group By、Union等多个数据流汇集的算子,产生了多个Watermark汇集的情况,为了保证Watermark的递增和数据的完整性,那么该算子会保留最小的Watermark,并发送给下游。
三、Flink窗口机制
流式计算是一种被设计用于处理无限数据集的数据处理引擎,而无限数据集是指一种不断增长的本质上无限的数据集,而Window是一种切割无限数据为有限块进行处理的手段。Window将一个无限的流拆分成有限大小的buckets,我们可以在这些桶上做计算操作。
Window可以分成两类:
- CountWindow:按照指定的数据条数生成一个Window,与时间无关。
- TimeWindow:按照时间生成Window【可以根据窗口实现原理的不同分成三类:滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)】
- 滚动窗口:时间对齐,窗口长度固定,没有重叠。
- 滑动窗口:时间对齐,窗口长度固定,可以有重叠,在这种情况下同一个元素可能会被分配到多个窗口中。
- 会话窗口:时间无对齐,一个窗口在一段时间未接受到数据后将会关闭,下次数据到来则开启一个新的窗口。(类似会话机制)
Window Function 定义了要对窗口中收集的数据做的计算操作,主要可以分为两类:
-
增量聚合函数:
每条数据到来就进行计算,保存一个简单的状态。典型的增量聚合函数有ReduceFunction, AggregateFunction。 -
全窗口函数:
先把窗口所有数据收集起来,等到计算的时候会遍历所有数据。ProcessWindowFunction就是一个全窗口函数。由上可知,窗口的数据都是保存在状态中的,并且窗口的容错机制靠状态的checkpoint机制实现。
以上是关于Flink原理学习窗口和时间的主要内容,如果未能解决你的问题,请参考以下文章