流计算中的 Window 计算 | 青训营笔记

95 阅读2分钟

这是我参与「第四届青训营 -大数据场」笔记创作活动的第9篇笔记

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

Watermark

watermark是用于处理乱序事件的,而正确的处理乱序事件,通常用watermark机制结合window来实现。 我们知道,流处理从事件产生,到流经source,再到operator,中间是有一个过程和时间的。虽然大部分情况下,流到operator的数据都是按照事件产生的时间顺序来的,但是也不排除由于网络、背压等原因,导致乱序的产生(out-of-order或者说late element)。 但是对于late element,我们又不能无限期的等下去,必须要有个机制来保证一个特定的时间后,必须触发window去进行计算了。这个特别的机制,就是watermark。

定义Watermark

image.png

传递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

cddb5c5daf4d44c99098759c22bffeb1.png

window

滚动窗口

image.png

窗口划分:

  1. 每个key单独划分
  2. 每条数据只会属于一个窗口

窗口触发:

Window结束时间到达的时候一次性触发

滑动窗口

image.png

窗口划分:

  1. 每个key单独划分
  2. 每条数据可能属于多个窗口

窗口触发:

Window结束时间到达的时候一次性触发