Apache kafka 暴风卡夫卡喷口无法读取上次读取

Apache kafka 暴风卡夫卡喷口无法读取上次读取,apache-kafka,apache-storm,Apache Kafka,Apache Storm,我正在使用storm-kafka-0.9.3从kafka读取数据,并在storm中处理这些数据。下面是我正在使用的卡夫卡喷口。但问题是,当我杀死风暴集群时,它不会读取在其死亡期间发送的旧数据,而是从最新偏移量开始读取 BrokerHosts hosts=newzkhosts(Constants.ZOOKEEPER\u HOST); 喷动配置喷动配置=新喷动配置(主机、CommonConstants.KAFKA\u事务\u主题\u名称 ,“/”+CommonConstants.KAFKA_事务_主

我正在使用storm-kafka-0.9.3从kafka读取数据,并在storm中处理这些数据。下面是我正在使用的卡夫卡喷口。但问题是,当我杀死风暴集群时,它不会读取在其死亡期间发送的旧数据,而是从最新偏移量开始读取

BrokerHosts hosts=newzkhosts(Constants.ZOOKEEPER\u HOST);
喷动配置喷动配置=新喷动配置(主机、CommonConstants.KAFKA\u事务\u主题\u名称
,“/”+CommonConstants.KAFKA_事务_主题_名称,UUID.randomUUID().toString());
spoutConfig.scheme=new SchemeAsMultiScheme(new StringScheme());
//永远不应该让这成为现实
喷动配置。forceFromStart=false;
spoutConfig.startOffsetTime=-2;
KafkaSpout KafkaSpout=新的KafkaSpout(spoutConfig);
返回卡夫卡;

我相信这可能会发生,因为当拓扑运行时,它使用以下路径将所有状态信息保存到zookeeper
SpoutConfig.zkRoot+“/”+SpoutConfig.id
,以便在发生故障时,它可以从zookeeper中最后写入的偏移量恢复

从医生那里得到的

重要信息:重新部署拓扑时,请确保未修改SpoutConfig.zkRoot和SpoutConfig.id的设置,否则spout将无法从ZooKeeper读取其以前的使用者状态信息(即偏移量)——这可能会导致意外行为和/或数据丢失,取决于您的用例

在您的例子中,由于
SpoutConfig.id
是一个随机值
UUID.randomuid().toString()
它无法检索最后提交的偏移量

也读同一页

当拓扑运行一次时,设置kafkanconfig.startoffsetime将不会对拓扑的后续运行产生影响,因为现在拓扑将依赖ZooKeeper中的使用者状态信息(偏移量)来确定从何处开始(更准确地说:恢复)读取。如果要强制喷口忽略ZooKeeper中存储的任何使用者状态信息,则应将参数kafkanconfig.ignoreZkOffsets设置为true。如果为true,喷口将始终从Kafkanconfig.startoffsetime定义的偏移量开始读取,如上所述


您可以使用静态
id
查看它是否能够检索。

您需要设置spoutConfig.zkServers和spoutConfig.zkPort:

BrokerHosts hosts = new ZkHosts(Constants.ZOOKEEPER_HOST);
SpoutConfig spoutConfig = new SpoutConfig(hosts,  CommonConstants.KAFKA_TRANSACTION_TOPIC_NAME
    , "/" + CommonConstants.KAFKA_TRANSACTION_TOPIC_NAME,"test");

spoutConfig.zkPort=Constants.ZOOKEEPER_PORT;  
spoutConfig.zkServers=Constants.ZOOKEEPER_SERVERS;

spoutConfig.scheme = new SchemeAsMultiScheme(new StringScheme());

KafkaSpout kafkaSpout = new KafkaSpout(spoutConfig);
return kafkaSpout;
谢谢大家, 因为我在本地模式下运行拓扑,所以Storm没有在ZK中存储偏移量,当我在Prod模式下运行拓扑时,它得到了解决


Sougata

你能试着注释掉吗
spoutConfig.forceFromStart=false
line或by set
spoutConfig.forceFromStart=true
尝试了相同的问题,请参见“假设我在卡夫卡中有100条消息,风暴处理”,现在假设在第100条消息风暴停止后,我的http端点在卡夫卡中又推送了300条消息,由于Storm只处理了100条消息,我预计当Storm醒来时,它应该从它留下的101条消息开始处理。那么到底发生了什么?在你的帖子中,你提到了从最新的偏移量开始阅读。。这不是你想要的吗?基本上,当strom回来时,它从401开始读取,而不是101。谢谢你的回复。仍不能按预期工作的喷动配置喷动配置=新喷动配置(主机,CommonConstants.KAFKA_事务主题名称,“/”+CommonConstants.KAFKA_事务主题名称,“测试”);喷动配置。forceFromStart=true;据我所知,您正在这样做-1)启动卡夫卡喷口读取100条消息(2)杀死拓扑(3)在队列中再推100条消息(4)再次进入拓扑。。从201偏移量开始读取。。这是正确的吗?是的,它从201开始,但我希望它应该从101开始,因为它没有处理最后100条消息。顺便说一句,我用过三叉戟也是同样的问题。它总是从201读取。那么什么配置帮助您解决了这个问题?