我正在使用zookeeper从kafka获取数据。在这里,我总是从最后一个偏移点获取数据。有没有办法指定偏移时间来获取旧数据?
有一个选项autooffset.reset。它接受最小或最大。有人可以解释什么是最小和最大的。 autooffset.reset可以帮助从旧的偏移点而不是最新的偏移点获取数据吗?
答案 0 :(得分:24)
消费者总是属于一个组,并且对于每个分区,Zookeeper会跟踪该分区中该使用者组的进度。
要从头开始获取,您可以删除与Hussain所指的进度相关的所有数据
ZkUtils.maybeDeletePath(${zkhost:zkport}", "/consumers/${group.id}");
您还可以指定所需分区的偏移量,如core / src / main / scala / kafka / tools / UpdateOffsetsInZK.scala中所指定
ZkUtils.updatePersistentPath(zkClient, topicDirs.consumerOffsetDir + "/" + partition, offset.toString)
但是,偏移量不是时间索引,但您知道每个分区都是一个序列。
如果您的消息包含时间戳(并且要注意此时间戳与Kafka收到您的消息时无关),您可以尝试通过将偏移量递增N来尝试逐步检索一个条目的索引器,在某处存储元组(主题X,第2部分,偏移100,时间戳)。
如果要从指定的时刻检索条目,可以将二进制搜索应用于粗略索引,直到找到所需的条目并从中获取。
答案 1 :(得分:8)
他们说,来自卡夫卡documentation “kafka.api.OffsetRequest.EarliestTime()在日志中找到数据的开头并从那里开始流式传输,kafka.api.OffsetRequest.LatestTime()将仅传输新消息。不要假设偏移量0是开头偏移量,因为消息随着时间的推移而逐渐消失。“
在此处使用SimpleConsumerExample:https://cwiki.apache.org/confluence/display/KAFKA/0.8.0+SimpleConsumer+Example
这可能会有所帮助
答案 2 :(得分:3)
有关偏移参数的最小值和最大值的查询,请参阅有关kafka config:http://kafka.apache.org/08/configuration.html的文档。
BTW,在探索kafka时,我想知道如何为消费者重播所有消息。我的意思是,如果一个消费者群体已经对所有消息进行了调查,并且它想要重新获取这些消息。
可以实现的方法是从zookeeper中删除数据。使用kafka.utils.ZkUtils类删除zookeeper上的节点。以下是它的用法:
ZkUtils.maybeDeletePath(${zkhost:zkport}", "/consumers/${group.id}");
答案 3 :(得分:2)
现在
Kafka常见问题解答给出了这个问题的答案。
如何使用OffsetRequest准确获取特定时间戳的消息偏移量?
Kafka允许按时间查询消息的偏移量,并且按片段粒度进行查询。 timestamp参数是unix时间戳,通过timestamp查询偏移量将返回不迟于给定时间戳附加的消息的最新可能偏移量。时间戳有2个特殊值 - 最新和最早。对于unix时间戳的任何其他值,Kafka将获得不迟于给定时间戳创建的日志段的起始偏移量。因此,由于偏移请求仅在段粒度下提供,因此对于较大的段大小,偏移量获取请求会返回不太准确的结果。
要获得更准确的结果,您可以根据时间(log.roll.ms)而不是size(log.segment.bytes)配置日志段大小。但是应该小心,因为这样做可能会因频繁的日志段滚动而增加文件处理程序的数量。
未来计划
Kafka会为邮件格式添加时间戳。请参阅
https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Enriched+Message+Metadata
答案 4 :(得分:1)
Kafka Protocol Doc是使用请求/响应/偏移/消息的绝佳来源: https://cwiki.apache.org/confluence/display/KAFKA/A+Guide+To+The+Kafka+Protocol 您使用简单消费者示例,如下面的代码演示状态:
FetchRequest req = new FetchRequestBuilder()
.clientId(clientName)
.addFetch(a_topic, a_partition, readOffset, 100000)
.build();
FetchResponse fetchResponse = simpleConsumer.fetch(req);
设置readOffset以从中开始初始偏移。但是你需要检查最大偏移量以及上面将根据addFetch方法的最后一个参数中的FetchSize提供有限的偏移量计数。
答案 5 :(得分:0)
使用KafkaConsumer,您可以使用Seek,SeekToBeginning和SeekToEnd在流中移动。
此外,如果没有提供分区,它将寻找所有当前分配的分区的第一个偏移量。
答案 6 :(得分:-1)
bin / kafka-console-consumer.sh --bootstrap-server localhost:9092 - topic test - from-beginning
它将打印出给定主题的所有消息,在此示例中为“test”。