我正在使用kafka spout来消费消息。但是,如果我必须更改拓扑并上传,那么它将从旧消息恢复还是从新消息开始? Kafka spout让我们知道从哪里消费的时间戳,但我怎么知道时间戳呢?
答案 0 :(得分:2)
spoutConfig.forceStartOffsetTime(-1);
它将选择围绕该时间戳写入的最新偏移量以开始消费。您可以 通过传入-1强制喷口总是从最新的偏移量开始,你可以强制 它从最早的偏移开始,传入-2。
答案 1 :(得分:1)
如果您使用的是KafkaSpout,请确保以下内容:
KafkaSpout将偏移量存储到zookeeper中。如果在KafkaSpout的KafkaConfig中将forceFromStart设置为true(在第一次部署拓扑时可能就是这种情况),则在重新部署期间要非常小心,它将忽略存储的zookeeper偏移。确保将其设置为false。
考虑编写拓扑,以便在拓扑的main()方法执行时从属性文件中读取KafkaConfig.forceFromStart值。这将允许您的管理员控制是否重播Kafka消息。
答案 2 :(得分:0)
基本上事件的顺序是:
首次通过以下属性开头读取拓扑:
forceFromStart = true
startOffsetTime = -2
上述道具将强制它从主题的开头开始。请记住同时具有这两个属性,因为forceFromStart
告诉storm读取startOffsetTime
属性并使用设置的值来确定从哪里开始读取,并忽略zookeeper偏移。
从现在开始,您的拓扑将运行,zookeeper将保持偏移量。如果您的工作人员死亡,它将由主管开始并从zookeeper中的偏移量开始读取。
现在,如果要重新启动拓扑并希望在关闭之前从中断处读取,请使用以下属性并重新启动拓扑:
forceFromStart = false
通过上面的属性,您告诉storm而不是读取startOffsetTime
值,而是使用在关闭拓扑之前维护的zookeeper偏移量。
从现在开始,每次重新启动拓扑时,它都会从剩下的位置读取。
如果要重新启动拓扑,并且想要从主题的顶部/顶部读取,请使用以下属性并重新启动拓扑:
forceFromStart = true
startOffsetTime = -1
通过上面的属性,你告诉storm忽略zookeeper偏移并从最新的偏移量开始,这是该主题的提示。