流式系统
上QQ阅读APP看书,第一时间看更新

2.1 路线图

为了帮助奠定本章的基础,我想列出5个主要概念,这些概念将构成本章所有讨论的基础,实际上这些概念也会支撑本书第一部分其余的大部分内容。目前我们已经讨论了其中的两个概念。

在第1章中,我首先确定了事件时间(事件发生的时间)和处理时间(事件在处理过程中被观测到的时间)之间的关键区别。这为本书中提出的主要观点之一,即如果你关心结果的正确性以及事件实际发生的上下文,则必须分析与事件固有的事件时间相关的数据,而不是分析在分析过程中产生的与处理时间相关的数据,奠定了基础。

接着,我引入了开窗的概念(即沿着时间边界对数据集进行分区)。开窗是一种用来处理无界数据源在技术上可能永远不会结束这样的事实的常见方法。开窗策略中较简单的例子有固定窗口和滑动窗口,但是更复杂的开窗类型,如会话(会话中窗口由数据本身的特征定义。例如,根据不活跃的间隔捕获每个用户的活跃会话)也被广泛应用。

除以上两个概念之外,我们现在还要仔细研究另外3个概念。

触发器

触发器是一种用于声明何时应该结合某些外部信号对窗口的输出内容进行物化的机制。触发器在选择何时应该对外发出输出时具有灵活性。在某种意义上,可以将它理解为一种用于指示结果应该何时被物化的流控机制。另一种理解触发器的方式是将它看成照相机上的快门释放装置,以允许在计算结果的过程中声明何时释放快门拍摄快照。

触发器还使得随着窗口演变多次观测其输出成为可能。这也反过来支持了流式处理结果随着时间变化而不断改进的特性,即在数据到达时提供推测性结果,同时处理上游随着时间变化(修订)的数据或者迟到的数据(例如,在移动通信场景中,即使某个人的手机处于离线状态,仍会记录其上的各种操作行为和这些操作行为的事件时间,然后在恢复网络连接时,继续上传这些事件记录以进行处理)。

水位

水位是关于事件时间输入完整性的概念。具有时间值X的水位表明:“系统已经观测到所有事件时间小于X的输入数据。”因此,当对无明确结束点的无界数据源进行观测时,水位充当了进度的度量标准。我们将在本章中介绍水位的基础知识,随后Slava将在第3章中深入探讨这一主题。

累积

累积模式具体说明了观测到同一窗口的多个输出结果之间的关系。这些结果可能完全没有关联,也就是说,根据时间的变化表示独立的增量,或者它们之间可能重叠。不同的累积模式具有不同的语义以及与之相关的成本,因此在各种使用场景中都能找到各自的适用性。

此外,我们在回答以下4个问题的结构中重新审视现有的理解并积极探索新知,因为我认为这样可以使我们更容易理解所有这些概念之间的关系,这4个问题对于每个无界数据处理问题都至关重要。

定义(what):计算出什么结果?流水线中的转换类型可以回答这个问题。这包括诸如计算总和、构建直方图、训练机器学习模型等。从本质上讲,这也是传统的批处理所回答的问题。

位置(where):以事件时间计,结果在何处被计算?通过在流水线中使用事件时间开窗可以回答这个问题。这包括第1章中开窗的常见例子(固定窗口、滑动窗口和会话),还包括不涉及开窗概念的使用场景(例如,时间无关的处理和传统的批处理通常也属于这一类),以及其他更复杂的开窗类型(例如限时拍卖场景中的开窗)。还要注意,如果你将进入时间指定为记录到达系统时的事件时间,则位置还可以包括基于处理时间的开窗。

时机(when):以处理时间计,结果在何时被物化输出?通过使用触发器和(可选的)水位可以解答这个问题。这个主题涉及无限多种变体,但是最常见的模式是那些涉及重复的更新(物化的视图语义),以及只有在确信对应输入完整的情况下,才利用水位为每个窗口提供单独的输出结果(应用于每个窗口的传统批处理语义),或者上述两者的结合。

方法(how):结果的改进如何相互关联?这个问题可以通过使用的累积类型来回答:丢弃(输出结果都是独立的且不同的)、累积(后输出的结果基于之前输出的结果)、累积及撤销(累积值以及对之前触发值的撤销都会发出)。

本书的后续章节中会更详细地研究上述每个问题。