本文根据论文Lightweight Asynchronous Snapshots for Distributed Dataflows
,通过这种轻量级的异步快照算法,解释Flink如何实现一致性快照以及恢复时如何实现exactly once的处理。
1、简介
对于分布式流处理系统而言,高吞吐、低延迟往往是最主要的需求。与此同时,容错在分布式系统中也很重要,对于正确性要求较高的场景,exactly once的实现往往也非常重要。
实时计算领域,往往低延迟、正确性是用户最关心的两个方面。
对于正确性,容错机制是必不可少的。当前分布式系统中保证exactly-once的处理,主要是通过对有状态的operator就行全局的、异性的快照完成的。但是这种方法通常有2个缺点:
1、为了获得全局的一致性状态,需要停止流处理程序,直到快照的完成,这显然对性能有着很大的影响。
2、快照的内容包含传输过程中所有的内容,这导致快照的大小过大。
因此,一种新型的分布式快照的算法是即提供轻量级的快照,同时让快照发生时对系统的影响降到最低。这种算法不会停止流处理,因此是异步的,而且对于整个无环图的拓扑结构,只对有状态的operator进行快照,因此快照的大小也会占用很小的空间。
这里所说的新型的快照算法,既适用于有向无环图,也适用于有向有环图。本文重点关注在有向无环图中的应用,即在Apache Flink中的异步barrier快照(Asynchronous Barrier Snapshotting (ABS))。
2、Apache Flink系统
简单来说,Flink就是一个分布式、有状态的批和流统一的流处理框架。每一个Flink的job都被编译为一个有向无环图(DAG)。在这个stream图中,每个点代表一个task,每个边代表task之间的数据传输。因此,每个operator既有输入也有输出(对于source而言,只有输出;对于sink而言,只有输入)。