重新处理/读取Kafka记录/消息-消费者组补偿重置的目的是什么?

时间:2019-06-27 03:46:56

标签: apache-kafka kafka-consumer-api

我的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消费者组的偏移量的目的是什么?

1 个答案:

答案 0 :(得分:4)

处理Kafka消费者补偿问题比较棘手。仅当使用的消费者组在内部Kafka主题中未提交有效的偏移量时,消费者程序才使用 auto.offset.reset 配置。(其他受支持的偏移量存储是Zookeeper,但内部Kafka主题用作偏移量存储在最新的Kafka版本中。

请考虑以下情形:

  1. 名为“ group1”的消费者组中的消费者已经消费了来自主题“ testtopic”的5条消息,并且偏移量详细信息已提交给内部Kafka主题-消费者下次启动时,将不使用“ 自动”。 offset.reset ”配置。相反,它将从存储中获取已存储的偏移量,并将继续从检索到的偏移量中获取消息。

  2. 名为“ group2”的消费者组中的
  3. 消费者作为新的消费者启动,以从“ 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

存在三种重置命令不起作用的可能性。

  1. 日志保留期较小,并且您要重置的偏移量不再可用
  2. 使用者组中的使用者实例正在运行。在这两种情况下,reset offset命令都可能不起作用。
  3. Kafka版本为<0.11。重置偏移量API仅可用于Kafka 0.11

从您的问题来看,第一种和第三种情况不太可能。请检查第二种情况。停止任何使用者实例运行,然后尝试重置偏移量。

以下命令可用于检查使用者组是否具有活动的使用者实例。

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