Flink 是否同时支持事件时间和处理时间

问题

  • Flink 程序是否同时支持 “事件时间窗口” 和 “处理时间窗口” ?

上周看到这个问题,当时的第一反应这人怕不是个 ** 哦!

后来越想越觉得有意思,用 Flink 这么久,任务要么是事件时间,要么处理时间,从来没遇到(想)过两种时间同时使用的情况。

Flink 支持的时间属性: 摄入时间、处理时间、事件时间 ,主要用于窗口、Join 操作、事件时间乱序的场景

回答

在程序上来说,同时有 事件时间的窗口 和 处理时间的窗口 是可以执行的

从原理上来说:

  1. 处理时间的窗口是基于 timestamp 触发的
  2. 事件时间的窗口是基于 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 的,处理时间的窗口正常触发,事件时间的窗口没有触发

posted on 2022-03-02 17:31  Flink菜鸟  阅读(404)  评论(0编辑  收藏  举报