一、重点内容:
- 概述流批计算、实时离线数仓的区别;window计算定义
- 介绍实时计算中的Watermark概念
- window类型及其实现原理、高级优化
- 描述两个业务场景的需求
二、详细知识点介绍:
Watermark
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是多少。
Window
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.
TUMBLE Window (滚动窗口)
- 每分钟页面浏览量
TumblingEventTimeWindows.of(Time.minutes(1))
HOP Window (滑动窗口)
- 每分钟的页面浏览量每 10 秒计算一次
SlidingEventTimeWindows.of(Time.minutes(1), Time.seconds(10))
SESSION Window (会话窗口)
- 每个会话的页面浏览量,其中会话由会话之间至少 30 分钟的间隔定义
EventTimeSessionWindows.withGap(Time.minutes(30))
迟到数据处理
默认情况下,当使用事件时间窗口时,延迟事件会被丢弃。(注意,不是数据的时间晚于watermark就算是迟到,而是它所属的窗口
已经被触发了
才算迟到)。
1、可以使用称为Side Outputs的机制安排将被丢弃的事件收集到备用输出流
OutputTag<Event> lateTag = new OutputTag<Event>("late"){};
SingleOutputStreamOperator<Event> result = stream.
.keyBy(...)
.window(...)
.sideOutputLateData(lateTag)
.process(...);
DataStream<Event> lateStream = result.getSideOutput(lateTag);
2、drop掉。默认情况下允许的延迟为 0。,watermark后面的元素被丢弃(或发送到侧输出)。
stream.
.keyBy(...)
.window(...)
.allowedLateness(Time.seconds(10))
.process(...);
注意:side output只有在DataStream的窗口中才可以用,在SQL中目前还没有这种语义,所以暂时只有drop这一个策略。