1.简介
主要有2种窗口,一个基于时间窗口,一个是基于数量窗口。
时间窗口中起止时间是,左闭右开
2.时间概念
2.1 事件生成时间
EventTime
指的是数据在设备上产生的时间。
这种模式下,不管数据何时到达或者顺序如何,都能得到一致的结果。
但是,在数据时间乱序的情况下,会产生一些延迟,性能会有影响。
ps: 1.12以后版本的flink,设置 事件时间窗口类型时(setStreamTimeCharacteristic )这个不需要设置,默认就是eventtime,
但是eventTime必须要设置水位线(assignTimestampsAndWatermarks,要指定时间字段),而基于处理时间的窗口processTime,不必须设置水位线。
2.2事件接入时间
Ingestion Time
指的是 数据接入flink的时间。
依赖算子所在主机的系统时钟。
接入时间位于,生成时间和处理时间之间。
事件接入时间模式,不能处理时间乱序和数据延迟问题。但是可以处理flink内部处理数据乱序问题。(该模式无法解决,数据到达flink之前,产生的乱序问题)
2.3事件处理时间
Processing Time
指的是算子在操作过程中,获取的主机时间。
该模式下,实时性最高。但是计算结果不一定准确。
主要用于计算精度不是很高,比如延时比较高的日志数据。
将事件时间和处理时间,进行区分,是flink的一大进步。(比如spark中是没有处理时间的,只有事件时间)
事件时间和处理时间的区别
3.flink设置时间窗口模式
eg: 设置事件时间 EventTime(1.12以后版本的flink不需手动设置,默认就是EventTime)
import org.apache.flink.streaming.api.TimeCharacteristic import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment object TimeWindowsTest { def main(args: Array[String]): Unit = { //create env val env = StreamExecutionEnvironment.getExecutionEnvironment //set the Event time windows env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime) //set the processingTime env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime) } }