前言
在分布式领域,计算和存储一直是两大子领域。很多分布式理念在计算和存储的实现中会有着完全不同的逻辑,比如我们快照,计算框架中的快照和我们平常说的存储快照实现不同点在于哪里呢?笔者做为一个研究存储模块出身的人,最近在研读Flink流处理的部分原理,小小作番总结。很多时候,以存储的眼光来看待计算过程中的处理过程,还是有很多不一样的地方的。下文中,笔者将逐一介绍Flink流处理的一些过程分析。额外说明一点,以下内容来源于早期Flink内部设计文档,可能与现今使用的Flink有所差异,详细来源可见文末引用地址。
流的时间有序性保证
在上一篇阐述Flink窗口处理的文章中,笔者提到了关于网络传输等外部因素造成的流数据的潜在乱序问题,也就是一些“迟到“了的数据。对于这种情况,Flink在内部提供了一种有序数据流的概念,当然这个有序流是一种被二次加工过的数据流,从而保证了其有序性。那么问题来了,这种数据流是进行了何种处理方式呢?
用一句简单地话来说:通过watermark对数据重排序,来保证整体数据流的有序性。
而这里分段数据的重排序,依靠的是数据流的watermark值。每当我们每接收到一份数据到buffer中时,我们选定其中最新的watermark值,对buffer里数据的时间小于此watermark值的数据在buffer中做一个排序。然后将此排序好的数据发向下游。这里基于的一个原则是:时间比当前watermark消息早的数据都已经到来了,所以我们可以大胆地把这批数据先拍好序再发出去。图示效果如下