分享

storm+kafka的新问题,求指点

caiyifeng 发表于 2015-5-8 13:56:43 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 2 15805
我构建了2个topology,一个Topology(producerTopology)是用来发送数据到kafka的,另一个topology(ConsumerTopology)则是用来把kafka的数据取出进行处理的:
我发现一个奇怪的问题:
1. 如果我把producerTopology 发布,让它先发送数据到kafka,等它把数据全部执行后,然后再发布ConsumerTopology,则ConsumerTopology无法获取
   kafka的数据
2. 但是如果我在producerTopology还在运行期间,也把ConsumerTopology也启动了,则ConsumerTopology能获取数据,但好像有丢数据(还在确认中)

3. 如果我在ConsumerTopology中配置了参数 spoutConf.forceFromStart =true;强行从第一条消息开始抓取,则也能获取数据,而且也不丢数据

请问这是什么问题,有什么方法能不设置 spoutConf.forceFromStart =true,ConsumerTopology能正确获取数据吗?
下次ConsumerTopology停掉再启动的时候,是从上次消费的最后一条消息往下取数据的

我是kafka2.9.2    ,storm 0.9.4


拜谢

已有(2)人评论

跳转到指定楼层
bioger_hit 发表于 2015-5-8 15:02:33
forceFromStart设为true,重启topology【楼主不这么设置,只要能达到相同的目的即可】


storm启动的时候,默认是从头读取-2,当kafkaspout的task出错时候,会重新启动,这时候offset就会从zk中最老的offset,但kafka数据只会保存一段时间,从zk中读取offset的数据可能已经不存在,超过现在的范围。

kafkaspout读取的3种选项

  -2: 从最老的开始读

  -1: 从最近的开始读


  0: 从Zk中读

storm在读取数据的时候,根据以上原因,可能会发生读取数据不全的情况

参考:
kafka-storm spout拉取数据问题offset out of range(todo)


storm-kafka-0.8-plus 源码解析



回复

使用道具 举报

caiyifeng 发表于 2015-5-8 22:55:35
多谢楼上这位兄弟,不过我的问题还是没解决啊,我在描述一遍:
1. 我现在已经把forceFromStart设为true了,数据能全部读取
2. 但问题是我希望的是每次读取时,以前已经消费过的数据是不能再消费了,如果一直把forceFromStart设为true是有问题的
3. 我的疑惑是为什么所有数据全部都发送到kafka之后,我再启动消费的topology时,却一直说未能发现数据
    而我在数据未全部发送到kafka的时候,启动消费的topology,能取得数据,但前面很多数据总是会丢失
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条