这是我参与「第四届青训营 -大数据场」笔记创作活动的第9篇笔记
本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
Watermark
watermark是用于处理乱序事件的,而正确的处理乱序事件,通常用watermark机制结合window来实现。 我们知道,流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络、背压等原因,导致乱序的产生(out-of-order或者说late element)。 但是对于late element,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了。这个特别的机制,就是watermark。
定义Watermark
传递Watermark
通常情况下, watermark在source函数中生成,但是也可以在source后任何阶段,如果指定多次 watermark,后面指定的 watermarker会覆盖前面的值。 source的每个sub task独立生成水印。 watermark通过operator时会推进operators处的当前event time,同时operators会为下游生成一个新的watermark。 多输入operator(union、 keyBy、 partition)的当前event time是其输入流event time的最小值。 注意:多并行度的情况下,watermark对齐会取所有channel最小的watermark
window
滚动窗口
窗口划分:
- 每个key单独划分
- 每条数据只会属于一个窗口
窗口触发:
Window结束时间到达的时候一次性触发
滑动窗口
窗口划分:
- 每个key单独划分
- 每条数据可能属于多个窗口
窗口触发:
Window结束时间到达的时候一次性触发