Flink设计与实现:核心原理与源码解析
上QQ阅读APP看书,第一时间看更新

1.1.2 DataFlow模型的设计思想

DataFlow是Google提出的编程模型,旨在提供一种统一批处理和流处理的系统,目前已经应用于Google Cloud。

Google认为,结构化的数据拥有远大于原始数据的价值,数据工作者虽然拥有很多强大的工具,能把大规模、无序的数据加工成结构化数据,但是现存的模型和方法在处理一些常见场景时依然有心无力。例如某流媒体平台提供商通过向广告商收费实现视频内容的商业变现,其收费依据是广告收看次数和时长。这家流媒体平台支持在线和离线两种方式播放广告,希望了解每天向广告商收费的金额,并对大量历史离线数据进行分析及实验。这样的场景就无法通过现有的模型实现。

传统的批处理系统(如MapReduce、FlumeJava、Spark等)都无法满足时延的要求,这主要是因为批处理系统需要先收集完所有数据并形成一个批次,然后才能开始处理。而流处理系统,如Aurora、TelegraphCQ、Niagara和Esper等,在大规模使用的情况下不能保持容错性。一些提供了可扩展和容错能力的系统缺乏准确性或语义的表达性,并且很多流系统(如Storm、Samza、Pulsar系统)缺乏Exactly-Once(恰好处理一次)的语义,这会影响数据处理的准确性。还有一些系统虽然提供了基于窗口计算的能力,但窗口的语义局限于记录数或处理时间,如Spark Streaming、Sonora、Trident等。Lambda架构能够满足上述大部分要求,但是其系统太过复杂,用户必须构建和维护离线及在线两套系统。Summingbird虽然改善了Lambda架构的复杂性并提供了针对批处理和流处理系统的统一封装抽象,但是这种抽象限制了支持计算的种类,并且同样需要维护两套系统,存在运维复杂性。

任何一种有广泛实用价值的方法都必须提供简单、强大的工具,可以为具体的使用案例平衡数据的准确性、延迟程度和处理成本。最后,Google提出了一个统一的模型——DataFlow。DataFlow能够对无界、无序的数据源按数据本身的特征进行窗口计算,得到基于事件发生时间的有序结果,并能在准确性、延迟程度和处理成本之间取得平衡。

分离数据处理的计算逻辑及对逻辑的物理实现,使得系统对批处理、微批处理、流计算引擎的选择简化为对准确性、延迟程度和处理成本的选择。为解决以上问题,DataFlow具备以下重要概念。

1.无界、有界与流处理、批处理

在描述无限和有限数据集时,人们更愿意使用无界和有界这样的描述,而不是流处理数据和批处理数据,这是因为流处理和批处理意味着使用特定的执行引擎。如图1-2所示,在现实场景中,无界数据集可以通过批处理系统反复调度来处理,而设计良好的流处理系统也可以完美地处理有界数据集。从这个角度来看,区分流处理和批处理的实际意义不大,这为后来Flink批流一体架构提供了理论基础。

图1-2 有界数据集与无界数据集

2.窗口计算

如图1-3所示,DataFlow提供了3种窗口计算类型,支持窗口把一个数据集切分为有限的数据片,以便于聚合处理。对于无界的数据,有些操作需要窗口,以定义大多数聚合操作需要的边界;另一些则不需要窗口(如过滤、映射、内链接等)。对于有界的数据,窗口是可选的,不过很多情况下仍然是一种有效的语义概念。

·固定窗口(fixed):按固定窗口大小定义,如小时窗口或天窗口。固定窗口一般都是对齐窗口,也就是说,每个窗口包含对应时间范围内的所有数据。有时为了把窗口计算的负荷均匀分摊到整个时间范围内,会在窗口边界时间加上一个随机数,这样窗口就变成了不对齐窗口。

图1-3 窗口计算分类

·滑动窗口(sliding):按窗口大小和滑动周期定义,如小时窗口,每一分钟滑动一次。滑动周期一般小于窗口,也就是窗口有相互重合之处。滑动窗口一般也是对齐的。固定窗口可以看作滑动窗口的一个特例,即窗口大小和滑动周期大小相等。

·会话窗口(session):会话是在数据的子集上捕捉一段时间内的活动。一般来说,会话窗口按超时时间定义,任何发生在超时时间以内的事件都被认为属于同一个会话。会话窗口是非对齐窗口,在图1-3中,窗口2只包含Key 1,窗口3只包含Key 2,而窗口1和4都包含了Key 3。假设Key是用户ID,两次活动之间的间隔超过了超时时间,则系统需要重新定义一个会话窗口。

3.时间域与水位线机制

如图1-4所示,将时间域分为两种类型,即事件时间(event time)和处理时间(processing time),其中事件时间指事件发生时的系统时间;处理时间指数据处理管道在处理数据时,一个事件被数据处理系统观察到的时间,即数据处理系统的时间。

图1-4 事件时间与处理时间关系图

事件时间和处理时间的主要区别在于,事件时间是永远不变的,而事件的处理时间会随着事件在数据管道中被处理而变化。在数据处理过程中,因为系统本身受到一些现实影响(通信延迟、调度算法、处理时长、管道中间数据序列化等),所以会导致这两个时间概念存在差值且动态波动。借助全局数据处理进度的标记或水位线(Watermark),可以有效处理迟到乱序的事件,得到正确的数据处理结果。

4.得出结论

综上,我们能够得到这样的结论:数据处理的未来是无界数据处理,尽管有界数据处理十分重要,但是在语义上会被无界数据处理模型涵盖。Google提出了很多新的概念,这些概念很快被一些优秀的项目实现,包括谷歌内部的MillWheel引擎、开源框架Flink。Flink提供了事件时间和处理时间,开发者可以基于不同的时间语义进行数据处理。基于事件时间的时间语义,Flink引入了Watermark机制处理乱序事件,以保证数据处理结果的准确性。可以看出,Flink快速吸收了DataFlow模型的核心思想,因此在后期的技术发展中占据非常大的优势。尤其是在批流一体化建设方面,基于流计算引擎,Flink实现了对有界数据集的处理,因此Flink必然是未来大数据发展的重要方向。