前言
最近在学习一些流处理相关的知识,对比与笔者接触比较多的离线处理系统,实时流处理的有些地方还是比较有意思的。在这里面,最常被人提到的词应该是“Exactly Once”语义 ,在工作面试中,如果做过实时流系统,肯定免不了被问到“xx框架是如何做到Exactly Once的”?笔者最近在阅读Spark Streaming的官方文档中,提到了这一点,于是来做个小小的总结归纳。如果感兴趣的同学,请继续往下阅读。
语义定义
在流处理系统中,我们对应数据记录的处理,有3种级别的语义定义,以此来衡量这个流处理系统的能力。
- At most once(最多一次)。每条数据记录最多被处理一次,潜台词也表明数据会有丢失(没被处理掉)的可能。
- At least once(最少一次)。每条数据记录至少被处理一次。这个比上一点强的地方在于这里至少保证数据不会丢,至少被处理过,唯一不足之处在于数据可能会被重复处理。
- Exactly once(恰好一次)。每条数据记录正好被处理一次。没有数据丢失,也没有重复的数据处理。这一点是3个语义里要求最高的。
基本语义
上一节介绍的语义是比较宽泛意义上的语义,这里我们再细分下里面的语义操作。比如说,我们可以把一个记录处理操作再划分为下面3个子操作:
- 接收数据的操作。从数据源接收数据的操作。
- 转换处理数据的操作。在这里面数据会被事先定义好的各种操作语义所处理。
- 输出数据操作。将处理好后的结果数据输出到外部系统文件系统,或数据集等等。