从风暴拓扑中的某个kafka偏移读取

时间:2017-09-27 16:06:43

标签: apache-kafka apache-storm

我试图让我的风暴拓扑在重启时读取某个kafka偏移量。

如果我理解正确,我可以ignoreZkOffsets并设置startOffsetTime来执行此操作,但到目前为止还没有这样做。

我尝试将startOffsetTime设置为System.currentTimeMillis() - 60000L,从一分钟开始,并将其设置为当前偏移量。

2 个答案:

答案 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仅提供EarliestTimeLatestTime 2种方法来设置初始偏移量,这意味着此方法无效。

如果您知道偏移值,则可以尝试修改stormkeeper中storm-kafka存储的偏移值。此值存储在${ZKRoot}/${ClientId}/${KafkaPartitionId}的ZKPath中,其中ClientId是您在SpoutConfig中指定的,如果您只有一个分区,则KafkaPartitionId通常为0.

找到此值后,根据需要设置此值并重新启动拓扑,它将从此偏移开始读取。如果此ZKPath不存在,您可以手动创建此路径。

此解决方案的一个缺陷是您应该了解您的clientId,这意味着您不能使用随机UUID作为您在启动风暴启动演示中建议的clientId。