StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
// alternatively:
// env.setStreamTimeCharacteristic(TimeCharacteristic.IngestionTime);
// env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
考虑这样一个问题,在基于 EventTime 处理的时候,Flink 是如何知道何时应该触发统计计算的呢?Watermark 就是为此而生的。
有界乱序下的 Watermark
而相反,在有界无需的数据流中,通过 Watermark 就可以有效处理,如上图所示
maxOutOfOrderness
, 表示可以容忍几个时间单位,如上图我们设置 maxOutOfOrderness
为 4,也就是说,如果接收到一个 EventTime 时间为 7 的数据,此处 Watermark 值应为 7-4 = 3。即当前 Watermark 在 3 处。在 Flink 的运行过程中,Watermark 将伴随整个数据的处理过程,如下图所示
除了基于 EventTime 的 Watermark,Watermark 还有一种生成策略 Punctuated Watermark。是基于事件流中的一种特殊事件作为 Watermark。