我使用storm-kafka-0.9.3从Kafka读取数据并在Storm中处理这些数据。下面是我正在使用的Kafka Spout。但问题是当我杀死Storm群集时,它不会读取在死亡时发送的旧数据,它会从最新的偏移量开始读取。
BrokerHosts hosts = new ZkHosts(Constants.ZOOKEEPER_HOST);
SpoutConfig spoutConfig = new SpoutConfig(hosts, CommonConstants.KAFKA_TRANSACTION_TOPIC_NAME
, "/" + CommonConstants.KAFKA_TRANSACTION_TOPIC_NAME,UUID.randomUUID().toString());
spoutConfig.scheme = new SchemeAsMultiScheme(new StringScheme());
//Never should make this true
spoutConfig.forceFromStart=false;
spoutConfig.startOffsetTime =-2;
KafkaSpout kafkaSpout = new KafkaSpout(spoutConfig);
return kafkaSpout;
答案 0 :(得分:2)
全部谢谢, 由于我在本地模式下运行拓扑,因此当我在Prod模式下运行拓扑时,Storm没有在ZK中存储Offset它已经解决了。
Sougata
答案 1 :(得分:1)
我相信这可能会发生,因为在拓扑运行时,它曾使用以下路径SpoutConfig.zkRoot+ "/" + SpoutConfig.id
将所有状态信息保存到zookeeper,以便在发生故障时可以从zookeeper中的最后一个写入偏移量恢复。
从文档
获得重要:重新部署拓扑时,请确保未修改SpoutConfig.zkRoot和SpoutConfig.id的设置,否则spout将无法读取其先前的使用者状态信息(来自ZooKeeper的偏移量 - 这可能会导致意外行为和/或数据丢失,具体取决于您的使用案例。
在您的情况下,SpoutConfig.id
是一个随机值UUID.randomUUID().toString()
它无法检索最后提交的偏移量。
同样从同一页面阅读
当拓扑运行后,设置 KafkaConfig.startOffsetTime将不会对拓扑的后续运行产生影响,因为现在拓扑将依赖于ZooKeeper中的使用者状态信息(偏移)来确定从哪里开始(更准确地说:简历)阅读。如果要强制spout忽略存储在ZooKeeper中的任何消费者状态信息,则应将参数 KafkaConfig.ignoreZkOffsets设置为true 。如果为true,则spout将始终从KafkaConfig.startOffsetTime定义的偏移量开始读取,如上所述
您可以使用静态id
来查看它是否能够检索。
答案 2 :(得分:0)
您需要设置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;