問(wèn)題描述:
通過(guò)LocalCluster提交storm KafkaSpout的應(yīng)用,每次重新提交應(yīng)用時(shí),消息都會(huì)重復(fù)消費(fèi),而且在zookeeper中不能創(chuàng)建存儲(chǔ)節(jié)點(diǎn).
日志中一直出現(xiàn)KeeperErrorCode = NoNode for 節(jié)點(diǎn)path.
從網(wǎng)上查看:
1. 大多都是bolt需要繼承BaseBasicBolt,也就是說(shuō)可能沒(méi)有ack.
2.SpoutConfig構(gòu)造中id是要唯一的.
但是我bolt繼承的就是BaseBasicBolt.而且我設(shè)置的id也是不沒(méi)有改變的.
解決方法:
我使用的是BrokerHosts brokerHosts = new ZkHosts(zkConnect);
SpoutConfig spoutConfig = new SpoutConfig(brokerHosts, topic, zkRoot,id);
首先storm kafka 的offset在zookeeper中保存的路徑方式為:${zkRoot}/${id}/${partitionId},但是在zookeeper中不能創(chuàng)建此路經(jīng),這就是導(dǎo)致沒(méi)有記錄下offset的進(jìn)度,重復(fù)消息的根本原因.
但是zk相關(guān)的信息在BrokerHosts已經(jīng)設(shè)置完成,為何找不到呢?
看上面SpoutConfig中的兩個(gè)變量,就是問(wèn)題的所在了,還需要設(shè)置這兩個(gè)成員變量,賦值之后,問(wèn)題就得到了解決.