streaming system有两篇经典博客:streaming 101和streaming 102,深刻的描述了流系统的精髓和对未来的展望,这篇文章权当一个导读的作用。
streaming 101对流计算的概念做了澄清,并表示Dataflow模型会是未来的趋势,在本文中,作者指出:
流计算是一种被设计来处理无穷数据集的数据处理系统引擎。
从这个定义上来说,流计算不仅仅是真正意义上的流计算(事件),也包括微批处理。(分别对应的实现就是Flink和Structure Streaming)。作者抽象出了数据集的概念,指出批处理和流处理的区别只是批处理是有限的数据集,而流处理是持续生成、无穷的数据集。
在流计算设计之初是为了处理低延迟、不精确/推测性结果的场景,后来Storm的作者提出了Lambda架构,让流计算配合批处理系统从而生成一个精确的结果(大概过程就是流计算系统提供低延迟、不准确的结果(或是因为使用了近似算法,或是因为流计算系统本身没能提供足够准确的结果),而一段时间之后等待批处理计算完成,再给出正确的结果)。但是Lambda架构引入了冗余,开发者需要维护两套环境,并且还需要对结果进行合并。
作者希望使用一套完整的Dataflow模型去弥补流处理和批处理的鸿沟,Dataflow模型解决了下面两个问题:
在流处理系统中,有两个比较容易混淆的概念:
理想情况下,处理时间和事件时间是一致的,但是往往会因为网络延迟等原因造成处理时间和事件时间的不一致,导致事件时间往往早于处理时间,从而造成了数据集的复杂性和不确定性。作者认为在旧式的流计算系统为了处理无穷数据集采取的分片策略过于简单,分片策略不能简单的依赖于事件时间和处理时间对数据进行分片,而是应该将无穷数据的复杂性和不确定性作为系统的设计核心,在新的数据到来时还能恰当的处理旧数据。
批处理在处理无穷数据集时,往往会使用下面的方法:
Dataflow模型认为无穷的数据集天生具有无序和时间偏移的特性,并根据情况给出四类方法解决这个问题:
当处理的场景与时间本质上无关时,所有的逻辑仅关心数据本身而非时间,例如过滤数据,Dataflow模型所做的仅仅只是数据传递。
以无穷数据为输入,基于处理时间,计算出差不多你想要的结果,例如近似Top N算法等,因为给出的是近似的结果,时间漂移和无序带来的微小错误自然可以忽略不计。
窗口主要分为下面三类:
前面也提到了事件时间和处理时间的概念,窗口的切分从而也分为两大类,各有优劣:
未完待续