昨天看到了这篇文章: 为什么Spark Streaming + Kafka很难保证exactly once? 看过后,对作者对Exactly Once的理解不敢苟同,所以想写这篇文章,阐述一下我对Spark Streaming保证Exactly Once语义的理解。
Exactly Once实现的整体性
首先一个很重要的道理是: 整个系统对exactly once的保证,从来都不是靠系统中某一部分来实现就能搞定的,需要整个流式系统一起努力才可以实现。
对Spark Streaming来说, Exactly once的实现,需要系统中三部分的整体保证:
输入源 --> Spark Streaming计算 ---> 输出操作
"输入源"对于exactly once的实现: Kafka的directly API其实就是在解决输入源输入数据的exactly once语义;
"Spark Streaming"部分的exactly once的shi实现: 使用WAL保证(注意我没有提checkpoint和replication, 因为这两个failover机制,并不是专门解决exactly once这个问题的)。
"输出操作"对于exactly once的实现: 需要输出结果保证幂等性, 这点官方文档已经说的比较清楚:
In order to achieve exactly-once semantics for output of your results, your output operation that saves the