分享

关于kafka offset手动提交问题

jnhcd 发表于 2017-1-20 15:04:22 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 49486
本人对kafka和storm理解比较浅显,不对之处敬请见谅

我们都知道,Consumer的配置enable.auto.commit=false设置了以后,offset不会自动提交,需要手动提交。

但是,offset位移是记录当前分区的topic数据已消费到哪一条,不是记录那些记录已经消费过,那些没有消费过。

这里我就有个问题想请教大家:

kafka结合storm使用时,kafkaspout读取数据下发到后续bolt,bolt处理结束ack,kafkaspout commit offset,具体流程大概就是这样。

spout:bolt是1:1时,没问题,但是当这个比例>1时,

topologyBuilder.setSpout("spout", new KafkaSpout(), 1);
topologyBuilder.setBolt("bolt1", new TestBolt(), 3).shuffleGrouping("spout");
如上设置时,一个spout读取到的数据下发到3个bolt中,例如offset分别为1,2,3的数据下发到bolt,
如果说offset为3的数据先处理完,ack后commit,此时offset为3,一旦storm环境因为外在原因终止,
offset1,2的数据就会丢失。

还是其他的一些情况,也会造成数据重复,这些异常情况一般怎么处理??

已有(3)人评论

跳转到指定楼层
nextuser 发表于 2017-1-20 17:00:53
本帖最后由 nextuser 于 2017-1-20 17:11 编辑

个人见解:
storm和kafka整合,strom spout去kafka数据,也就是spout是消费者。其它没有关系。
一旦storm环境因为外在原因终止,offset1,2的数据就会丢失。
一般来讲offset应该是由消费者维护的,被记录在zookeeper。并且这个序号会在分区中生成的。
里面的数据是可以重复消费的,并且消费完毕不会消失。数据在kafka中,不会丢失这么一说




回复

使用道具 举报

jnhcd 发表于 2017-1-20 17:48:36
nextuser 发表于 2017-1-20 17:00
个人见解:
storm和kafka整合,strom spout去kafka数据,也就是spout是消费者。其它没有关系。
一旦storm ...

数据肯定不会丢失,但是处理数据时,每条数据是否处理完成你都要在zk上重新记录吗
kafka本上已经在zk上记录了已消费到的offset了啊
回复

使用道具 举报

qcbb001 发表于 2017-1-20 19:41:07
jnhcd 发表于 2017-1-20 17:48
数据肯定不会丢失,但是处理数据时,每条数据是否处理完成你都要在zk上重新记录吗
kafka本上已经在zk上 ...


offset只是某些情况的叫法,还有另外一种叫法position

引用下面看法,楼主可以看下,希望有所帮助
在 consumer 端,大家都知道可以控制 offset,所以可以控制消费,其实 offset 只有在重启的时候才会用到。在机器正常运行时我们用的是 position,我们实时消费的位置也是 position 而不是 offset。我们可以得到每一条消息的 position。如果我们在处理消息之前就将当前消息的 position 保存到 zk 上即 offset,这就是只多一次消费,因为我们可能保存成功后,消息还没有消费机器就挂了,当机器再打开时此消息就丢失了;或者我们可以先消费消息然后保存 position 到 zk 上即 offset,此时我们就是至少一次,因为我们可能在消费完消息后offset 没有保存成功。而精确一次的做法就是让 position的保存和消息的消费成为原子性操作,比如将消息和 position 同时保存到 hdfs 上 ,此时保存的 position 就称为 offset,当机器重启后,从 hdfs重新读入offset,这就是精确一次。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条