我的kafka主题总共有10条记录/消息,还有2个分区,每个分区有5条消息。我的使用者组有2个使用者,每个使用者已经分别从其分配的分区中读取了5条消息。现在,我想从开始/开始(偏移量0)重新处理/读取主题中的消息。
我停止了我的kafka使用者,并执行以下命令将使用者组偏移量重置为0。
./kafka-consumer-groups.sh --group cg1 --reset-offsets --to-offset 0 --topic t1 --execute --bootstrap-server "..."
我的期望是,一旦我重新启动我的kafka使用者,他们将开始从偏移量0即开始读取记录,但是没有发生,而是从最后一个位置(即偏移量5)开始轮询。为什么会这样?然后,我必须让每个消费者都明确地寻求偏移0(开始)以从头开始重新处理/读取记录。在以后的测试周期中,我什至没有跑过为Kafka用户组重置偏移量的命令。
我的问题是,如果我必须让我的消费者明确寻求开始使其重新处理/阅读消息,那么重置kafka消费者组的偏移量的目的是什么?
答案 0 :(得分:4)
处理Kafka消费者补偿问题比较棘手。仅当使用的消费者组在内部Kafka主题中未提交有效的偏移量时,消费者程序才使用 auto.offset.reset 配置。(其他受支持的偏移量存储是Zookeeper,但内部Kafka主题用作偏移量存储在最新的Kafka版本中。
请考虑以下情形:
名为“ group1”的消费者组中的消费者已经消费了来自主题“ testtopic”的5条消息,并且偏移量详细信息已提交给内部Kafka主题-消费者下次启动时,将不使用“ 自动”。 offset.reset ”配置。相反,它将从存储中获取已存储的偏移量,并将继续从检索到的偏移量中获取消息。
消费者作为新的消费者启动,以从“ testtopic”中获取消息。这是新组,内部Kafka主题中没有可用的偏移量详细信息-' auto.offset.reset '配置现在用于确定从何处开始;从主题开始或从最新开始(仅使用新消息)。
根据您的问题,问题是重置偏移量的命令不起作用,您必须手动寻求开始和启动使用者。
kafka-consumer-groups.sh --bootstrap-server <kafka_host:port> --group <group_id> [--topic <topic_name> or --all-topics] --reset-offsets [--to-earliest or --to-offset <offset>] --execute
存在三种重置命令不起作用的可能性。
从您的问题来看,第一种和第三种情况不太可能。请检查第二种情况。停止任何使用者实例运行,然后尝试重置偏移量。
以下命令可用于检查使用者组是否具有活动的使用者实例。
kafka-consumer-groups.sh --bootstrap-server <kafka_host:port> --group <group_id> --describe
示例输出:
Consumer group 'group1' has no active members.
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
intro 0 0 99 99