MHuiG

「看庭前花开花落,望天上云卷云舒」

Window

# Flink 中的三种 Window

Flink Window Demo 源码 GitHub

## 什么是 Window？

统计经过某红绿灯的汽车数量之和？

假设在一个红绿灯处，统计通过此红绿灯的汽车数量

可以把汽车的经过看成一个流，无穷的流，不断有汽车经过此红绿灯，因此无法统计总共的汽车数量。但是，我们可以换一种思路，每隔 `15` 秒，我们都将与上一次的结果进行 `sum` 操作（滑动聚合）

这个结果似乎还是无法回答我们的问题，根本原因在于流是无界的，我们不能限制流，但可以在有一个有界的范围内处理无界的流数据。因此，我们需要换一个问题的提法：每分钟经过某红绿灯的汽车数量之和？

这个问题，就相当于一个定义了一个 `Window`（窗口），`Window` 的界限是 `1` 分钟，且每分钟内的数据互不干扰，因此也可以称为翻滚（不重合）窗口，如下图：

再考虑一种情况，每 `30` 秒统计一次过去 `1` 分钟的汽车数量之和

此时，`Window` 出现了重合。这样，`1` 个小时内会有 `120` 个 `Window`。

- `Window` 指定时间范围内的所有数据
- 滚动窗口 各个窗口之间的数据不重叠（不重复）
- 滑动窗口 各个窗口之间的数据重叠（重复）

## Window 有什么作用？

通常来讲，`Window` 就是用来对一个无限的流设置一个有限的集合，在有界的数据集上进行操作的一种机制。`Window` 又可以分为基于时间（Time-based）的 `Window` 以及基于数量（Count-based）的 `window`。

## Flink 中的三种 Window

Flink 在 KeyedStream（DataStream 的继承类） 中提供了下面几种 Window：

- 以时间驱动的 `Time Window`
- 以事件数量驱动的 `Count Window`
- 以会话间隔驱动的 `Session Window`

## Time Window

- 正如命名那样，`Time Window` 根据时间来聚合流数据。
- 例如：一分钟的时间窗口就只会收集一分钟的数据，并在一分钟过后对窗口中的所有数据应用于下一个算子。
- 在 Flink 中使用 `Time Window` 非常简单，输入一个时间参数，这个时间参数可以利用 `Time` 这个类来控制，如果事前没指定 `TimeCharacteristic` 类型的话，则默认使用的是 `ProcessingTime`

    dataStream.keyBy(1)
    .timeWindow(Time.minutes(1)) //time Window 每分钟统计一次数量和
    .sum(1);

    dataStream.keyBy(1)
    .timeWindow(Time.minutes(1), Time.seconds(30)) //隔 30s 统计过去1m和
    .sum(1);

### Count Window

`Apache Flink` 还提供计数窗口功能，如果计数窗口的值设置的为 `3` ，那么将会在窗口中收集 `3` 个事件，并在添加第 `3` 个事件时才会计算窗口中所有事件的值。

    dataStream.keyBy(1)
    .countWindow(3) //统计每 3 个元素的数量之和
    .sum(1);

    dataStream.keyBy(1)
    .countWindow(4, 3) //每隔 3 个元素统计过去 4 个元素的数量之和
    .sum(1);

### Session Window

`Apache Flink` 还提供了会话窗口，是什么意思呢？使用该窗口的时候你可以传入一个时间参数（表示某种数据维持的会话持续时长），如果超过这个时间，就代表着超出会话时长。

    dataStream.keyBy(1)
    .window(ProcessingTimeSessionWindows.withGap(Time.seconds(5)))//表示如果 5s 内没出现数据则认为超出会话时长，然后计算这个窗口的和
    .sum(1);

Flink实时处理Socket数据

Socket Flink 实时处理 Socket 数据 Flink Socket 源码 GitHub 通过 Maven Archetype 创建项目创建项目mvn archetype:g...

Flink常用的算子

Operator Flink 常用的算子 Flink 数据处理模型在 Flink 应用程序中，无论你的应用程序是批程序，还是流程序，都是下图这种模型，有数据源（source），有数据下游...

留言区

Notes
Flink
本文目录
<pjax>
</pjax>
<pjax></pjax>
<pjax> Are you Robot?</pjax>