Storm-Kafka之LocalCluster模式下KafkaSpout重复消费(原因是local模式读不到集群的yaml配置文件)

问题描述:

通过LocalCluster提交storm KafkaSpout的应用,每次重新提交应用时,消息都会重复消费,而且在zookeeper中不能创建存储节点.

日志中一直出现KeeperErrorCode = NoNode for 节点path.


从网上查看:

1. 大多都是bolt需要继承BaseBasicBolt,也就是说可能没有ack.

2.SpoutConfig构造中id是要唯一的.

但是我bolt继承的就是BaseBasicBolt.而且我设置的id也是不没有改变的.

解决方法:

我使用的是BrokerHosts brokerHosts = new ZkHosts(zkConnect);

SpoutConfig spoutConfig = new SpoutConfig(brokerHosts, topic, zkRoot,id);

首先storm kafka 的offset在zookeeper中保存的路径方式为:${zkRoot}/${id}/${partitionId},但是在zookeeper中不能创建此路经,这就是导致没有记录下offset的进度,重复消息的根本原因.


但是zk相关的信息在BrokerHosts已经设置完成,为何找不到呢?

看上面SpoutConfig中的两个变量,就是问题的所在了,还需要设置这两个成员变量,赋值之后,问题就得到了解决.

(主要原因是local模式下读不到集群的yaml配置文件,导致无法向zookeeper注册信息)

比如我们在创建SpoutConfig对象后设置SpoutConfig对象的zkServers和zkPort属性:如下代码:

 
  1. SpoutConfig spoutConfig = new SpoutConfig(new ZkHosts(Constants.ZK_HOSTS), Constants.KAFKA_TOPIC_MAIN_SERVER_LOGS, Constants.KAFKA_TOPIC_MAIN_SERVER_LOGS_ROOT_DIR, Constants.KAFKA_TOPIC_MAIN_SERVER_LOGS);

  2. spoutConfig.zkServers = Arrays.asList(Constants.ZK_SERVERS);

  3. spoutConfig.zkPort = Constants.ZK_PORT;

其中,

 
  1. spoutConfig.zkServers = Arrays.asList(Constants.ZK_SERVERS);

  2. spoutConfig.zkPort = Constants.ZK_PORT;

这两行代码是解决问题的关键所在。


总结:storm kafka 提供的KafkaSpout组件是将offset维护在上面设置的zk路径下.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值