时间语义
flink明确支持以下三种时间语义,如果想要使用事件时间,需要额外给flink提供一个时间戳提取器和Watermark生成器,flink使用它们来跟踪事件时间的进度
- 事件时间:事件产生时间,数据中的记录的时间
- 摄取时间:flink读取事件时的时间
- 处理时间:具体算子处理事件的时间
Watermarks
watermarks的作用是定义何时停止等待较早的时间(乱序的事件流)
windows
windows的作用是将无界数据流分解成有界数据流做聚合分析
用 flink 计算窗口分析取决于两个主要的抽象操作:Window Assigners,将事件分配给窗口(根据需要创建新的窗口对象),以及 Window Functions,处理窗口内的数据
窗口分类
- 滚动时间窗口
- 滑动时间窗口
- 滚动事件窗口
- 滑动事件窗口
- 会话窗口
- 全局窗口
窗口应用函数
- 批处理,
ProcessWindowFunction
会缓存Iterable
和窗口内容,供接下来全量计算 - 流处理,每一次有事件被分配到窗口时,都会调用
ReduceFunction
或者AggregateFunction
来增量计算 - 两者结合,通过
ReduceFunction
或者AggregateFunction
预聚合的增量计算结果在触发窗口时, 提供给ProcessWindowFunction
做全量计算
晚到的事件
默认场景下,超过最大无序边界的事件会被删除,但我们有两个选择去控制这些事件
- 旁路输出
- 指定允许的延迟间隔,在这个间隔事件内,延迟的事件会继续分配给窗口
深入了解窗口操作
- 滑动窗口是通过复制来实现的
- 时间窗口会和时间对齐,一个小时的窗口,12:05开始运行,第一个窗口会在1:00关闭。滑动窗口和滚动窗口分配器所才用的offset参数可以改变窗口的对齐方式。
- 窗口后面可以再接窗口
- 事件触发窗口的创建,如果窗口内没有事件,就不会有窗口,也就不会输出结果