我试图让我的风暴拓扑在重启时读取某个kafka偏移量。
如果我理解正确,我可以ignoreZkOffsets
并设置startOffsetTime
来执行此操作,但到目前为止还没有这样做。
我尝试将startOffsetTime
设置为System.currentTimeMillis() - 60000L
,从一分钟开始,并将其设置为当前偏移量。
答案 0 :(得分:0)
从kafka常见问题解答页面" Kafka允许按时间查询消息的偏移量,并且它在段粒度上进行查询。 timestamp参数是unix时间戳,通过timestamp查询偏移量将返回不迟于给定时间戳附加的消息的最新可能偏移量。时间戳有2个特殊值 - 最新(从主题末尾开始)和最早(从主题开头)。对于unix时间戳的任何其他值,Kafka将获得不迟于给定时间戳创建的日志段的起始偏移量。因此,由于偏移请求仅在段粒度下提供,因此对于较大的段大小,偏移量获取请求会返回不太准确的结果。" https://cwiki.apache.org/confluence/display/KAFKA/FAQ#FAQ-HowdoIaccuratelygetoffsetsofmessagesforacertaintimestampusingOffsetRequest?
如果您知道应用程序应该开始使用消息的偏移号,那么在zookeeper中设置它并将ignoreZkOffsets转为true。
FYI: zookeeper的节点路径将是您在spout配置期间为 zkRoot 属性指定的值。
希望这会对你有所帮助。
答案 1 :(得分:0)
您对ignoreZkOffsets的理解部分正确,将此选项设置为true将缩短存储在zookeeper中的偏移量,但startOffsetTime不是任意Unix时间戳。默认startOffsetTime的初始化如下:
public long startOffsetTime = kafka.api.OffsetRequest.EarliestTime();
Kafka api仅提供EarliestTime
和LatestTime
2种方法来设置初始偏移量,这意味着此方法无效。
如果您知道偏移值,则可以尝试修改stormkeeper中storm-kafka存储的偏移值。此值存储在${ZKRoot}/${ClientId}/${KafkaPartitionId}
的ZKPath中,其中ClientId是您在SpoutConfig中指定的,如果您只有一个分区,则KafkaPartitionId通常为0.
找到此值后,根据需要设置此值并重新启动拓扑,它将从此偏移开始读取。如果此ZKPath不存在,您可以手动创建此路径。
此解决方案的一个缺陷是您应该了解您的clientId,这意味着您不能使用随机UUID作为您在启动风暴启动演示中建议的clientId。