时间流与水印
- 一、背景
- 二、时间语义
-
- [1.事件时间(event time)](#1.事件时间(event time))
- [2.读取时间(ingestion time)](#2.读取时间(ingestion time))
- [3.处理时间(processing time)](#3.处理时间(processing time))
- 三、水印-Watermarks
- 四、Windows
- 总结
一、背景
Flink需要支持流重放并且还要不影响结果,因此不能仅仅支持计算时间还要支持事件时间。事件流在传输和处理过程耗时不同,导致下游节点接受到的数据流可能是乱序的。由于程序不能无限制等待所有事件到达之后再处理,因此需要决定何时停止等待前序事件,这就是Watermarks的作用。
Flink中流入的数据分为三种类型:事件流、watermark和checkpoint barriers。其中watermark和checkpoint barriers都是flink根据一些策略生产的。
二、时间语义
Flink支持三种时间语义:
1.事件时间(event time)
事件产生的时间,记录的是设备生产或者存储事件的时间。
2.读取时间(ingestion time)
Flink读取事件时记录的时间
3.处理时间(processing time)
Flink 具体算子处理事件的时间
三、水印-Watermarks
Watermarks主要是定义何时停止等待较早事件。在Flink中采用的是固定延迟策略,也就是假定所有的事件都是有一个最大延迟。
1.延迟和正确性
开发人员需要在延迟和结果正确性作出权衡。如果Watermarks的边界时间设置的相对较短,那么会快速产生一个可能不太准确的结果。如果Watermarks的边界时间设置的小队较长,那么会延迟很久的情况下产生一个相对比较准确的结果。
2.延迟事件
如果算子接受到了Watermark(t) ,则表示事件流的时间已经到达了 t; watermark 之后的时间戳 ≤ t 的任何事件都被称之为延迟事件。
3.顺序流
在顺序流中,watermark也是顺序的分布在整个事件流中,并且是周期性出现的。
4.无序流
针对无序流由于事件不是按照时间戳顺序出现,所以watermark非常重要。watermark到达算子就表明这个时间戳之前的所有事件都已经到达了此算子,此算子就可以进行相应计算。并且在操作完成后会生成一个新的watermark以供下游算子参考。
5.并行流
watermark是在数据源输入时产生的,各个分区输入是互相独立的。当watermark到达某个算子时,算子会产生一个新的watermark。如果算子有多个输入流,算子会输出输入流中事件时间的最小值。
四、Windows
Flink在窗口的场景上处理有非常丰富的api,应用过程中经常遇到分析一个时间段内的浏览量、最高量、平均值等场景。
1.窗口维度分类
对于无界数据流进行一些数据统计不现实,所以需要在一定的窗口内对数据进行统计和分析。按照划分维度可以分为时间窗口和数量窗口。
1.1 时间窗口
时间窗口就是以时间点来定义窗口的开始和结束,在窗口开放期间符合条件的事件会进入窗口,在窗口结束前会对窗口内的事件进行计算和处理。
1.2 数量窗口
数量窗口就是以事件个数来定义窗口的开始和结束,在窗口开放期间事件会进入窗口,在窗口结束前会对窗口内的事件进行计算和处理。
2.窗口规则分类
除了维度窗口外,每个窗口的划分还有更细致的划分:滚动窗口( Tumbling Window )、滑动窗口( Sliding Window )、会话窗口( Session Window ),以及全局窗口( Global Window )。
2.1 滚动窗口
滚动窗口是指固定大小的窗口,对数据流按时间或者事件个数进行均匀的划分。窗口之间是首尾想接的没有重叠。比如计算每分钟页面浏览量。
2.2 滑动窗口
滑动窗口大小也是固定的,但是滑动窗口首尾不是相接的有一定重叠。比如计算每10秒计算前一分钟的页面浏览量。
2.3 会话窗口
会话窗口就是基于会话来对数据进行分组。
2.4 全局窗口
全局窗口会把相同key的所有数据放到同一个窗口中。
3.内置窗口
Flink计算窗口主要有两个抽象概念:窗口分配器和窗口函数,窗口分配器主要是指如果将事件分配到窗口,窗口函数是指如何对窗口内的事件进行处理。
Flink内置窗口分配器如下:
基于时间的窗口即可以根据事件时间也可以根据处理时间来划分窗口,基于计算的窗口只有在事件数量达到要求才会触发计算。
4.窗口函数
窗口函数可以进行增量计算和全量计算。
4.1 增量计算
开发者需要继承ReduceFunction或AggregateFunction。当每个事件被加到窗口时,都会调用 ReduceFunction 或者 AggregateFunction 来增量计算。
4.2 全量计算
开发者需要继承ProcessWindowFunction。当触发窗口时,会调用ProcessWindowFunction做全量计算。
总结
主要是对时间流和水印产生背景和作用进行了介绍,对窗口分类和窗口函数进行初步了解。
参考链接
1.Flink实时流