kafka的offset笔记

版本

這個看起來有點多此一舉,

我一開始也是這麼想的。

後來經過測試發現,新版本的kafka已經不再兼容老版本的kafka中的命令了,所以本篇記錄是爲了針對新版本的kafka的相關操作的。

組件版本
Zookeeper3.6.0
Kafka2.5.0

 

概念

①生产者Offset

生产者写入topic的各个partition时,有多少个partition就有多少个offset

②消费者Offset

file

这是某一个分区的offset情况,我们已经知道生产者写入的offset是最新最大的值也就是12,

而当Consumer A进行消费时,他从0开始消费,一直消费到了9,他的offset就记录在了9,

Consumer B就纪录在了11。

等下一次他们再来消费时,他们可以选择接着上一次的位置消费,当然也可以选择从头消费,或者跳到最近的记录并从“现在”开始消费。

此时,每个partition有多少消费组,那就有多少个offset

 

消费者组

file

费者组的概念其实并不影响对offset的理解,上面的情况Consumer A,Consumer B如果是同组就不能同时消费一个分区的消息,不同组的消费者可以同时消费一个分区的消息。

还有一种offset的说法,就是consumer消费未提交时,本地是有另外一个offset的,这个offset不一定与集群中记录的offset一致。

所以,kafka每一个topic分区和生产者,消费者不同,是有多个offset的。

 

 

概念总结如下:

offset是指某一个分区的偏移量。

topic partition offset 这三个唯一确定一条消息。

生产者的offset其实就是最新的offset。

消费者的offset是他自己维护的,他可以选择分区最开始,最新,也可以记住他消费到哪了。

消费者组是为了不同组的消费者可以同时消费一个分区的消息。

 

關於Group這個概念

首先注意,producer沒有group的說法,

kafka提到group一定是consumer這邊。

 

Group-id位置

具體文件變量
$KAFKA/config/consumer.propertiesgroup.id
$KAFKA/config/connect-distributed.propertiesgroup.id

如果在新建topic的時候,不特別指定,那麼默認使用的是consumer.properties裏面的group.id

 

__consumer_offsets的哪個partition保存了consumer group的位移信息

查看$KAFKA/config/consumer.properties

得到group.id是test-consumer-group,

填入下面的代碼並運行

public class kafka_hash {

        public static void main(String args[]){
            System.out.println(Math.abs("test-consumer-group".hashCode()) % 50);

        }
    }

實驗結果爲31

也就是說__consumer_offsets的partition 31保存了consumer group的位移信息

記住31這個數字,後面會用到

操作

操作

具體命令

创建topic$KAFKA/bin/kafka-topics.sh --zookeeper Desktop:2181 --create --topic mytopic --replication-factor 3 --partitions 3
查看topic列表$KAFKA/bin/kafka-topics.sh --list --zookeeper Desktop:2181
生產數據$KAFKA/bin/kafka-console-producer.sh --broker-list Desktop:9091 --topic mytopic
存放在各個partition的offset終點$KAFKA/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list Desktop:9091,Laptop:9092,Laptop:9093 --topic mytopic --time -1
存放在各個partition的offset起點

$KAFKA/bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list Desktop:9091,Laptop:9092,Laptop:9093 --topic mytopic --time -2

查询__consumer_offsets topic所有内容$KAFKA/bin/kafka-console-consumer.sh --consumer.config $KAFKA/config/consumer.properties \
--formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" \
--bootstrap-server Desktop:9091 --topic __consumer_offsets --from-beginning
查詢__consumer_offsets的partition 31包含的關於mytopic的offset信息
$KAFKA/bin/kafka-console-consumer.sh  \
--formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" \
--bootstrap-server Desktop:9091 --topic __consumer_offsets  --partition 31 --from-beginning

 

上面的最後一句命令會得到:

[test-consumer-group,mytopic,1]::OffsetAndMetadata(offset=3, leaderEpoch=Optional[0], metadata=, commitTimestamp=1611494686173, expireTimestamp=None)
[test-consumer-group,mytopic,0]::OffsetAndMetadata(offset=4, leaderEpoch=Optional[0], metadata=, commitTimestamp=1611494686173, expireTimestamp=None)
[test-consumer-group,mytopic,2]::OffsetAndMetadata(offset=4, leaderEpoch=Optional[0], metadata=, commitTimestamp=1611494691174, expireTimestamp=None)
[test-consumer-group,mytopic,1]::OffsetAndMetadata(offset=3, leaderEpoch=Optional[0], metadata=, commitTimestamp=1611494691174, expireTimestamp=None)
 

上述表格中produce端需要的数据如下:

{"user_id": "543462", "item_id":"1715", "category_id": "1464116", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
{"user_id": "662867", "item_id":"2244074", "category_id": "1575622", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
{"user_id": "561558", "item_id":"3611281", "category_id": "965809", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
{"user_id": "894923", "item_id":"3076029", "category_id": "1879194", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
{"user_id": "834377", "item_id":"4541270", "category_id": "3738615", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
{"user_id": "315321", "item_id":"942195", "category_id": "4339722", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
{"user_id": "625915", "item_id":"1162383", "category_id": "570735", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
{"user_id": "578814", "item_id":"176722", "category_id": "982926", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
{"user_id": "873335", "item_id":"1256540", "category_id": "1451783", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
{"user_id": "429984", "item_id":"4625350", "category_id": "2355072", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
{"user_id": "866796", "item_id":"534083", "category_id": "4203730", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}
{"user_id": "937166", "item_id":"321683", "category_id": "2355072", "behavior": "pv", "ts": "2017-11-26T01:00:00Z"}

 

其他

另外,根據[5],在同一個consumer group中,對於同一個topic而言,只能有一個consumer消費到其中特定的一條數據。

[6]中提到了Coordinator

Reference:

[1]Kafka到底有几个Offset?——Kafka核心之偏移量机制
[2]自己维护kafka_offset中的坑

[3]kafka查询最新producer offset的命令

[4]Kafka 如何读取offset topic内容 (__consumer_offsets)

[5]多个consumer使用同一个group.id消费同一个topic

[6]Kafka消费组(consumer group)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值