offset的默认维护位置
- Kafka0.9版本之前,consumer默认将offset保存在Zookeeper中。
- 从0.9版本开始,consumer默认将offset保存在Kafka一个内置的topic中,该topic为__consumer_offsets
- 为什么要改:如果每一个一个消费者与zookeeper交互,会带来大量网络通讯,效率低下。
__consumer_offsets主题里面采用 key 和 value 的方式存储数据。 key 是 group.id+topic+分区号, value 就是当前 offset 的值 。 每隔一段时间, kafka 内部会对这个 topic 进行compact ,也就是每个 group.id+topic+ 分区号就保留最新数据。
消费者offset案例
- 思想 :___consumer_offsets 为 Kafka 中的 topic ,那就可以通过消费者进行消费 。
- 在配置文件 config/ consumer.properties 中添加配置 exclude.internal.topics=false,默认是 true ,表示不能消费系统主题。为了查看该系统主题数据,所以该参数修改为 false 。
root@redis01:/usr/local/kafka# vim config/consumer.properties
consumer.properties
,kafka集群其他节点都需要改,不用重启Kafka集群。
exclude.internal.topics=false
- 创建新的topic
root@redis01:/usr/local/kafka# ./bin/kafka-topics.sh --bootstrap-server redis01:9092 --topic test2 --create --partitions 2 --replication-factor 2
- 启动生产者往 test2生产数据
root@redis01:/usr/local/kafka# ./bin/kafka-console-producer.sh --bootstrap-server redis01:9092 --topic test2 >
- 启动消费者消费test2数据
root@redis02:/usr/local/kafka# ./bin/kafka-console-consumer.sh --bootstrap-server redis01:9092 --topic test2 --group grouptest
注意:指定消费者组名称,更好观察数据存储位置 key 是 group.id+topic+ 分区号 。
- 查看消费者消费主题
__consumer_offsets
./bin/kafka-console-consumer.sh --topic __consumer_offsets --bootstrap-server redis01:9092 --consumer.config ./config/consumer.properties --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --from-beginning