kafka的内部主题__consumer_offset详细讲解

01 __consumer_offset

是kafka默认的内部主题
里面存放偏移量,之前版本偏移量存放在zk中,但zk不适合大量写入操作,在kafka1.0.2版本后存放到了kafka中这个主题
这个主题默认有50个分区

创建一个主题
kafka-topics.sh --zookeeper localhost:2181/myKafka --create --topic topicName4 --partitions 5 --replication-factor 1

先生产100行数据,上传到linux上
自动探测
自动换行
public static void main(String[] args) throws IOException {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(new File(“D:/message.txt”)));
for(int i = 0; i < 100; i++) {
bufferedWriter.write(“hello word”);
bufferedWriter.newLine();
}
bufferedWriter.close();
}
给这个主题发送消息,在message.txt所在的目录使用下面的命令
kafka-console-producer.sh --broker-list localhost:9092 --topic topicName4 < message.txt

默认没有指定key,根据round-robin方式,消息分布到不同的分区上(本例中生产了100条消息),但实际对都发送到了同一个分区
查询生产者的偏移量
kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list localhost:9092 --topic topicName4 --time -1
自动探测
自动换行
topicName4:0:0
topicName4:1:100
topicName4:2:0
topicName4:3:0
topicName4:4:0
表明100条消息全部发送到主题上发送成功

使用一个消费者进行消费,不要关闭进程,让其阻塞消费
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topicName4 --from-beginning

获取所有的消费组id,获取上面消费者属于的消费组id,返回的例如是console-consumer-42476
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list

根据消费组id可以查看这个消费组的偏移量
kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group console-consumer-42476

查询__consumer_offsets主题中的所有内容
运行下面命令前先要在consumer.properties中设置exclude.internal.topics=false
自动探测
自动换行
kafka-console-consumer.sh --topic __consumer_offsets --bootstrap-server localhost:9092 --formatter “kafka.coordinator.group.GroupMetadataManager$OffsetsMessageFormatter” --consumer.config /install/kafka/kafka_2.12-2.8.2/config/consumer.properties --from-beginning
输出格式如下
自动探测
自动换行
[test-consumer-group,__consumer_offsets,32]::OffsetAndMetadata(offset=0, leaderEpoch=Optional.empty, metadata=, commitTimestamp=1675759571635, expireTimestamp=None)
[test-consumer-group,__consumer_offsets,40]::OffsetAndMetadata(offset=4658, leaderEpoch=Optional[0], metadata=, commitTimestamp=1675759571635, expireTimestamp=None)
[组名称,主题名称,主题分区号]::[OffsetMetadata][偏移量, … 创建时间,超时时间]

默认情况下__consumer_offsets有50个分区,怎么知道消费组的偏移量写到哪个分区去,需要计算
用到了前面获取的group.id(本例中是console-consumer-42476)。Kafka会使用下面公式计算该group位移保存在__consumer_offsets的哪个分区上
自动探测
自动换行
String str = “console-consumer-42476”;
System.out.println(Math.abs(str.hashCode()) % 50);
输出24,即__consumer_offsets的分区19保存了这个consumer group的位移信息。

获取指定consumer group的位移信息,根据主题名和在–consumere-offset的分区号
kafka-simple-consumer-shell.sh --topic __consumer_offsets --partition 24 --broker-list localhost:9092 --formatter
“kafka.coordinator.group.GroupMetadataManager$OffsetsMessageFormatter”

输出格式和查询全部时的格式是一样的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值