Streaming 101

流数据特点

无界、无序。

Lamdba架构和Kappa架构

Lambda架构:通过流处理提供低延迟、不准确的结果,通过批处理提供准确的修正结果。
Kappa架构:通过流处理提供低延迟、准确的结果。

Kappa架构对流处理引擎的两个要求:

  1. 正确性。也就是消息恰好消费一次。
  2. 推理时间的工具。

正确性:
中间状态的存储,包括:源数据消费位置、正在消费的数据、计算的中间结果等等。MillWheel论文描述了细粒度的存储方式,State Management of Apache Flink论文描述了粗粒度的存储方式。

推理时间的工具:
窗口、水位线、触发器、累积。

数据完整性:
不知道什么时候某个窗口的数据会变得完整。随着时间的变化,推理可能的结束时间(水位线),出现迟到的数据,再处理一遍(触发器)。

事件发生时间和事件处理时间

事件发生时间:由数据源提供,事件的实际发生时间。
事件处理事件:批/流处理引擎处理事件的时间。

Streaming 102

水位线、触发器和累积

水位线:水位线是相对于事件发生时间的输入完整性概念。水位线表示一个时间 X,表示所有事件时间 触发器:触发器是一种由外部条件触发、表明何时计算窗口结果的机制。触发器可以让我们灵活的选择何时计算结果并发送给下游,而且随着数据的不停的到来,窗口可以产生多次输出。
累积:累积模式指定在同一窗口中观察到的多个结果之间的关系。这些结果可能完全相互之间完全独立,或者它们之间可能存在重叠。

What、Where、When和How

【What】计算的结果是什么?
这个由 Pipeline 中的转换来决定。例如计算总和、构建直方图、训练机器学习模型等等。
【Where】在事件时间中的哪个位置计算结果?
这个一般由在 Pipeline 中使用事件时间窗口来决定。
【When】在处理时间中的哪个时刻触发计算结果?
我们通过使用水位线和触发器来回答的这个问题。这里的场景比较多样,但最常见的模式是在给定窗口的输入完成时使用水位线来描绘,触发器允许提前计算结果和延迟计算结果。
【How】如何修正结果?
这个问题由所使用的累积类型回答:丢弃(其中结果是相互独立和不同的),累积(后来的结果建立在先前的结果上),累积和撤回(当前的累积值和上次触发的值撤回一起发送)。

Streams and Tables

流到表:由更新操作构成的流,聚合产生了表。
表到流:表的持续变化产生了流。

表:静止的数据。表达某个时间点的状态。
流:运动的数据。表达状态随着时间产生的变化。

stream -> stream: Nongrouping(element-wise) operations.
stream -> table: Grouping operations.
table -> stream: Ungrouping(triggering) operations.
table -> table: nonexistent.

Streaming SQL

streaming和nonstreaming数据处理的区别:
增加了时间维度。

Beam模型和经典SQL模型的区别:
beam是面向流的方法,经典SQL是面向表的方法。

如何选择table/stream:
如果所有的输入都是表,那么输出最好也是表。如果所有的输入都是流,那么输出最好也是流。

经典SQL如何支持流处理语义:
也就是支持Windowing、Watermark、Trigger。

Time-Varying Relations(TVR)的概念:
一系列随着时间变化的经典关系的快照。

TVR和Stream关键字:
通过TVR和Stream关键字,尤其是Stream关键字,可以看到窗口数据的创建、撤回、更新的全过程。细节看:
Stream and Table Selection - Retractions in a SQL world

Streaming Joins

Unwindowed Join

join是group操作的特殊形式,group操作总是消费一个流,产生一张表,所以所有的join都是streaming join。

所有Join的基础是Full Outer Join,其他Join,比如Left Outer Join、Right Outer Join、Inner Join、Anti Join、Semi Join,都是Full Outer Join的变体。

通过每条记录触发一次输出的形式,观察table、TVR、stream三种不同渲染方式的结果。这三种方式其实是相同结果的不同视图。

Windowed Join

窗口化Join其实就是增加了一个join条件,数据所在的窗口要相同。细节看:Fixed Windows

窗口化Join的好处:

  1. The ability to partition the join within time for some business need
  2. The ability to tie results from the join to the progress of a watermark

Temporal Validity Windows的概念:
session window是撤回、合并原来的窗口,Temporal Validity Windows是撤回、拆分原来的窗口。计算货币兑换率是一个例子,每条货币兑换率的消息只有起始时间,没有结束时间,需要根据后续的消息确定货币兑换率的有效时间窗口。结合水线,可以减少需要撤回的窗口。