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

138 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第4天

流式计算中的Window计算

Watermark

在数据中插入一些watermark用以 表现当前真实的时间 。可以很好的处理乱序的数据,保证数据的实时性。

watermark的传递

下面的图模拟了watermark在有序的数据流中:

有两个watermark,w(11)和w(20)。在w(11)左边的数据要求不小于11才不算做迟到的数据,同理在w(20)左边的数据不小于20才不算迟到。

watermark在有序数据流

下面的图模拟了watermark在乱序的数据流中:

在多数情况数据并不是有序的,watermark对于这些乱序的流可以很好的截出迟到的数据。

watermark在乱序数据流


在有多个上游的情况下,每个上游的watermark会不相同,这时候会 选择watermark较小的一个 ,如下图显示: 平行流中的watermark

有时候也会因为一些元素违反watermark的条件,导致即使在 w(t) 发生后,也会出现更多带有时间戳 t' <= t 的元素。

默认情况下,watermark 一旦越过窗口结束的 timestamp,迟到的数据就会被直接丢弃。

但是 Flink 允许指定窗口算子最大的 allowed lateness。 Allowed lateness 定义了一个元素 可以在迟到多长时间的情况下不被丢弃 ,这个参数默认是 0。

就像是上课迟到,宽容的老师会允许你迟到几分钟的。


watermark的产生

Per-subtask: (早期版本)一个source subtask产生watermark,若一个source subtask消费多个partition,那么多个partition之间的数据读取可能会加重数据的混乱。


Per-partition: 每个分区单独产生watermask,这种方式可以有效的避免上面的方式产生的问题。



Window基本概念

聚合事件在流上的工作方式与批量处理不同。由于流是无界的通常通过 时间 或者 元素数量 来驱动窗口来处理聚合事件。

window的分类

一般生产主要有三种:

  • Tumble Window 滚动窗口

  • Sliding Window 滑动窗口

  • Session Window 会话窗口


滚动窗口

每个key单独划分,每条数据只属于一个窗口, 窗口的大小固定不重叠 ,到结束时间时一次性触发。

如下图所示:

滚动窗口

滑动窗口

每个key单独划分,与滚动窗口类似,但每条数据可能属于多个窗口, 窗口大小固定会重叠 ,到结束时间时一次性触发。

如下图所示: 滑动窗口


会话窗口

每个key单独划分,每条数据会单独划分为一个窗口,如果窗口之间有交集,则对窗口进行合并, 窗口大小不固定不重叠 ,到结束时间时一次性触发。

如下图所示:

会话窗口



Window常见问题

迟到数据处理

  1. 默认丢弃
  2. Allow lateness:设置允许迟到时间
  3. SideOutput(侧输出流):对迟到数据打tag,交给用户自己决定处理

EMIT

通常window在结束的时候才会输出结果,但如果窗口比较大的时候计算结果的数据延迟就比较高。

EMIT指的是,在window还没有结束的时候,提前把部分的结果输出出来



参考自官方文档 Timely Stream Processing

参考自官方文档 Windows