【问题标题】:How does Kafka store offsets for each topic?Kafka 如何存储每个主题的偏移量?
【发布时间】:2018-01-23 00:32:01
【问题描述】:
在轮询 Kafka 时,我使用 subscribe() 函数订阅了多个主题。现在,我想设置我想从每个主题中读取的偏移量,而不是在每个主题之后重新订阅 seek() 和 poll()。 在轮询数据之前在每个主题名称上迭代调用seek() 会达到结果吗?
偏移量是如何准确存储在 Kafka 中的?
每个主题有一个分区,只有一个消费者可以读取所有主题。
【问题讨论】:
标签:
java
apache-kafka
kafka-consumer-api
【解决方案1】:
Kafka 如何存储每个主题的偏移量?
Kafka 已将偏移存储从 zookeeper 转移到 kafka brokers。原因如下:
Zookeeper 不是服务高写入负载(例如偏移更新)的好方法,因为 Zookeeper 将每次写入路由到每个节点,因此无法分区或以其他方式扩展写入。我们一直都知道这一点,但是因为我们已经依赖 zk,所以选择这种实现作为一种“方便的婚姻”。
Kafka 将偏移量提交存储在主题中,当消费者提交偏移量时,kafka 将提交偏移量消息发布到“commit-log”主题并保留将组/主题/分区映射到最新偏移量的内存结构用于快速检索。更多设计信息可以在这个page about offset management找到。
现在,我想设置我想从每个主题读取的偏移量,而不是在每个主题的 seek() 和 poll() 之后重新订阅。
有一个关于 kafka 管理工具的新功能来重置偏移量。
kafka-consumer-group.sh --bootstrap-server 127.0.0.1:9092 --group
your-consumer-group **--reset-offsets** --to-offset 1 --all-topics --execute
有more options you can use。