Storm Kafka Spout无法阅读最后阅读

时间:2015-05-19 07:33:17

标签: apache-kafka apache-storm

我使用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;

3 个答案:

答案 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;