卡夫卡风暴喷口改变拓扑结构并消耗旧的偏移量

时间:2013-12-09 10:10:49

标签: apache-storm apache-kafka

我正在使用kafka spout来消费消息。但是,如果我必须更改拓扑并上传,那么它将从旧消息恢复还是从新消息开始? Kafka spout让我们知道从哪里消费的时间戳,但我怎么知道时间戳呢?

3 个答案:

答案 0 :(得分:2)

spoutConfig.forceStartOffsetTime(-1);

  

它将选择围绕该时间戳写入的最新偏移量以开始消费。您可以   通过传入-1强制喷口总是从最新的偏移量开始,你可以强制   它从最早的偏移开始,传入-2。

references

答案 1 :(得分:1)

如果您使用的是KafkaSpout,请确保以下内容:

  1. 在你的SpoutConfig“id”和“zkroot"之后不要改变 重新部署新版本的拓扑。风暴使用“ zkroot“,”id“将主题偏移存储到zookeeper
  2. KafkaConfig.forceFromStart设置为false。
  3. KafkaSpout将偏移量存储到zookeeper中。如果在KafkaSpout的KafkaConfig中将forceFromStart设置为true(在第一次部署拓扑时可能就是这种情况),则在重新部署期间要非常小心,它将忽略存储的zookeeper偏移。确保将其设置为false。

    考虑编写拓扑,以便在拓扑的main()方法执行时从属性文件中读取KafkaConfig.forceFromStart值。这将允许您的管理员控制是否重播Kafka消息。

答案 2 :(得分:0)

基本上事件的顺序是:

  1. 首次通过以下属性开头读取拓扑:

    forceFromStart = true
    
    startOffsetTime = -2
    
  2. 上述道具将强制它从主题的开头开始。请记住同时具有这两个属性,因为forceFromStart告诉storm读取startOffsetTime属性并使用设置的值来确定从哪里开始读取,并忽略zookeeper偏移。

    从现在开始,您的拓扑将运行,zookeeper将保持偏移量。如果您的工作人员死亡,它将由主管开始并从zookeeper中的偏移量开始读取。

    1. 现在,如果要重新启动拓扑并希望在关闭之前从中断处读取,请使用以下属性并重新启动拓扑:

      forceFromStart = false
      
    2. 通过上面的属性,您告诉storm而不是读取startOffsetTime值,而是使用在关闭拓扑之前维护的zookeeper偏移量。

      从现在开始,每次重新启动拓扑时,它都会从剩下的位置读取。

      1. 如果要重新启动拓扑,并且想要从主题的顶部/顶部读取,请使用以下属性并重新启动拓扑:

        forceFromStart = true
        
        startOffsetTime = -1
        
      2. 通过上面的属性,你告诉storm忽略zookeeper偏移并从最新的偏移量开始,这是该主题的提示。