0%

Flink 0. 流处理基本概念

无界流和有界流

无界数据流:

  • 持续生成的, 本质上无限的数据集合
  • 数据会随时间的推演而持续增加,计算持续进行且不存在结束的状态

有界数据流:

  • 有限的数据集合
  • 数据大小固定,计算最终会完成并处于结束的状态

状态

我们在设计一个微服务程序的时候, 往往追求服务是无状态的——这是因为要满足快速扩容、弹性缩容的要求。
而对于无状态, 实际要求我们的接口满足幂等性-即无论多少次访问接口,同样的输入总能得到同样的输出。
这里的状态,指的就是中间计算结果

但是流计算本质属于’增量处理’, 通常需要不断查询、保持状态;

时间语义

Time

  • Event Time(很重要), 事件实际发生的时间
  • Ingestion Time(不太重要), 数据进入流处理引擎的时间
  • Processing Time(重要), 流计算引擎真正开始处理事件的时间
    flink time

Watermarks, 水位线

预估收到数据的截止时间。决定窗口是否触发, 小于水位线的数据默认丢弃。
watermarks

Window

流处理应用中, 数据是连续不断的,因此我们不可能等所有数据都到了才处理。通常我们可以每来一个消息就处理一次, 但是有时我们需要做一些聚合类的处理。

比如: 在过去的1小时内,有多少用户访问了我们的网页。

为满足这种需求, 我们可以定义一个窗口, 用来收集最近1小时的数据, 并对窗口内的数据计算。

窗口可以是时间驱动(Time Window, 例如:每分钟), 也可以数据驱动(Count Window, 例如:每1000条记录)。

通常把窗口分为三类:

  • 滚动窗口, Tumbling Window

    • 将数据依据固定窗口长度进行切割
    • 时间对齐,窗口长度固定,无重叠
  • 滑动窗口,Sliding Window

    • 窗口按照固定长度,平滑地对数据一直(实际上有滑动间隔)切割
    • 窗口长度固定,有重叠
  • 会话窗口

    • 一段时间内没有接收到新数据就会生成新的窗口
    • 时间不对齐

Trigger

触发器。决定了一个窗口何时能被计算或清除, 每个窗口都会拥有一个自己的Trigger。