Flink 中的 Time 分为三种:事件时间、达到时间与处理时间。
This is precisely what watermarks do — they define when to stop waiting for earlier events.
If you want to use event time, you will also need to supply a Timestamp Extractor and Watermark Generator that Flink will use to track the progress of event time.
Watermark定义:当前系统认为的事件时间所在的真实时间。(它们定义了何时停止等待较早的事件。
Watermark产生:从数据的事件时间来产生。最常见的包括使用当前事件时间的时间减去一个固定的delay,来表示可以可以容忍多长时间的乱序。
Watermark传递:上游将watermark传递给下游;下游收到多个watermark后默认取其中最小值来作为自身的watermark,同时它也会将自己watermark传递给它的下游。经过整个传递过程,最终系统中每一个计算单元就都会实时的知道自身当前的watermark是多少。
Computing windowed analytics with Flink depends on two principal abstractions: Window Assigners that assign events to windows (creating new window objects as necessary), and Window Functions that are applied to the events assigned to a window.
TumblingEventTimeWindows.of(Time.minutes(1))
SlidingEventTimeWindows.of(Time.minutes(1), Time.seconds(10))
EventTimeSessionWindows.withGap(Time.minutes(30))
默认情况下,当使用事件时间窗口时,延迟事件会被丢弃。(注意,不是数据的时间晚于watermark就算是迟到,而是它所属的窗口
已经被触发了
才算迟到)。
1、可以使用称为Side Outputs的机制安排将被丢弃的事件收集到备用输出流
OutputTag lateTag = new OutputTag("late"){};
SingleOutputStreamOperator result = stream.
.keyBy(...)
.window(...)
.sideOutputLateData(lateTag)
.process(...);
DataStream lateStream = result.getSideOutput(lateTag);
2、drop掉。默认情况下允许的延迟为 0。,watermark后面的元素被丢弃(或发送到侧输出)。
stream.
.keyBy(...)
.window(...)
.allowedLateness(Time.seconds(10))
.process(...);
注意:side output只有在DataStream的窗口中才可以用,在SQL中目前还没有这种语义,所以暂时只有drop这一个策略。