SparkStreaming On Kafka —— Offse

2020-03-23  本文已影响0人  code_solve

一、Kafka 消费者如何管理 offset

我之前有写一篇kafka Consumer — offset的控制
如果你对于这方面的知识还不太清楚,
建议你去看一下,
毕竟理解了Kafka的消费者,
你才能更好的使用SparkStreaming结合Kafka。

二、Spark Streaming On Kafka 如何管理 offset

1. 自动提交

1.1 使用

这个没什么好讲的,
应该是最简单的方式,
我们只需要在使用的时候,
确保 enable.auto.commit=true就行,
那么Spark每次拉取到Kafka的数据后,
offset会即刻保存。

1.2 缺点

这种方式的缺点很明显,
当我们拉取到数据之后,
offset就被提交了,
如果后续我们数据处理失败,
下次再去读取,
将会从offset的地方进行读取,
这样失败的数据就会被认为已经成功处理,
也就发生了数据丢失。

不过这种方式在一些对数据要求不是很精准的场景比较好用,
因为使用起来是真的非常简单,
所以如果你不 Care 这一点点的数据丢失,
那就果断用起来吧!!!

2. 手动提交

既然自动提交会造成数据缺失,
那么我们有什么办法不造成数据缺失吗?
那就是手动提交了。
下面我们来聊聊手动提交的一些方式。

2.1 使用

首先确保 enable.auto.commit=false
当我们从kafka拉取到数据,
就不会再自动提交offset了,
这时候的offset就可以任由我们自己控制,
一个很典型的方式就是,
当Spark处理完一个批次的数据,
我们把这个offset 提交到 kafka。

2.2 手动提交容易出现的问题

我们可以想象,当我们处理完数据后,
我们才对offset进行了提交,
这也意味着如果数据处理失败,
我们可以选择不提交offset,
下次我们还是可以从kafka读到该批数据,
然后再进行处理,
这时候自然是不会存在数据丢失的,
但是如果我们上次处理的这批数据成功一半,失败一半,
那么成功的那一半数据就会被重复消费了。

2.3 那么我们能否做到 EOS 的处理

使用SparkStreaming想要做到EOS其实还是挺难的,
但是也并非不可以,下面我们来看看如何做到EOS。

首先我们知道,
使用手动消费我们的数据是很容易做到at least once语义的,
所以要做到 EOS,
我们只需要关注如何做到处理的数据不重复即可。

基本都是说的一些理论的东西
不过我这些实现起来也都不难,
我也就不多赘述了,
如果有需要代码或者例子的,
可以留言,
后续也许会出一篇关于实现的文章。

最后希望本文对你有所帮助,喜欢就点个赞吧~~~

上一篇 下一篇

猜你喜欢

热点阅读