Flink 是否同时支持事件时间和处理时间
问题
- Flink 程序是否同时支持 “事件时间窗口” 和 “处理时间窗口” ?
上周看到这个问题,当时的第一反应这人怕不是个 ** 哦!
后来越想越觉得有意思,用 Flink 这么久,任务要么是事件时间,要么处理时间,从来没遇到(想)过两种时间同时使用的情况。
Flink 的时间属性
Flink 支持的时间属性: 摄入时间、处理时间、事件时间 ,主要用于窗口、Join 操作、事件时间乱序的场景
回答
在程序上来说,同时有 事件时间的窗口 和 处理时间的窗口 是可以执行的
从原理上来说:
- 处理时间的窗口是基于 timestamp 触发的
- 事件时间的窗口是基于 watermark 触发的
知道原理了,就知道怎么处理: 只需要把任务设置为事件时间,生成 timestamp 和 watermark ,事件时间和处理时间的窗口都会触发(基于事件时间的watermark)
如果任务是处理时间的,任务也不会报错,只是事件时间的窗口不能触发
测试代码
代码比较简单,就贴核心代码:
// event
stream
.window(TumblingEventTimeWindows.of(Time.minutes(1)))
// .window(TumblingProcessingTimeWindows.of(Time.seconds(10)))
.process(new SimpleProcessFunction("eventTime"))
.name("event")
.uid("event")
.disableChaining()
.print()
// process
stream
.window(TumblingProcessingTimeWindows.of(Time.minutes(1)))
.process(new SimpleProcessFunction("processTime"))
.name("process")
.uid("process")
.disableChaining()
.print()
完整代码参考: github flink-rookie BothProcessAndEventTime
事件时间
事件时间下,设置 timestamp 和 watermark
事件时间和处理时间的窗口都有 watermark,都在触发
处理时间
处理时间只需要把设置 timestamp 和 watermark 的代码注释即可
可以看到,算子是没有 watermark 的,处理时间的窗口正常触发,事件时间的窗口没有触发