
Event Time:是事件创建的时间。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink通过时间戳分配器访问事件时间戳。
Ingestion Time:是数据进入Flink的时间。
Processing Time:是每一个执行基于时间操作的算子的本地系统时间,与机器相关,默认的时间属性就是Processing Time。
究竟哪个时间对我们才是意义要研究的呢。
一条日志进入Flink的时间为2020-05-01 10:00:00.123,到达Window的系统时间为2020-05-01 10:00:01.234,日志的内容如下:
2020-05-01 18:37:15.624 INFO Fail over to rm2
对于业务来说,要统计1min内的故障日志个数,哪个时间是最有意义的?
—— eventTime,因为我们要根据日志的生成时间进行统计。
滚动窗口

特点:时间对齐,窗口长度固定,没有重叠。
适用场景:适合做BI统计等(做每个时间段的聚合计算)
scala代码 求15s的滚动窗口
val minTempPerWindow = dataStream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.timeWindow(Time.seconds(15))
.reduce((r1, r2) => (r1._1, r1._2.min(r2._2)))scala代码 求个数为5的滚动窗口
val minTempPerWindow: DataStream[(String, Double)] = dataStream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.countWindow(5)
.reduce((r1, r2) => (r1._1, r1._2.max(r2._2)))滑动窗口

特点:时间对齐,窗口长度固定,有重叠。
适用场景:对最近一个时间段内的统计,比如股票系统开盘后要实时查看最近1小时的交易数据,就需要设计window size=1hour,window slide=1min,这样系统就会每分钟刷新最近的交易数据,这种应用场景只能通过滑动窗口来实现。
scala代码 求窗口大小为15s,滑动距离为5s的窗口
val minTempPerWindow: DataStream[(String, Double)] = dataStream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.timeWindow(Time.seconds(15), Time.seconds(5))
.reduce((r1, r2) => (r1._1, r1._2.min(r2._2)))scala代码 求窗口个数为5,步长为1的滑动窗口
val minTempPerWindow: DataStream[(String, Double)] = dataStream
.map(r => (r.id, r.temperature))
.keyBy(_._1)
.countWindow(5)
.reduce((r1, r2) => (r1._1, r1._2.max(r2._2)))会话窗口

特点:时间无对齐。失效时间的设置,gap大于一定的值就关闭窗口,如window3差点关闭
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69918097/viewspace-3164578/ ,如需转载,请注明出处,否则将追究法律责任。