Kafka新消费者:(重新)使用assign设置和提交偏移,而不是订阅

时间:2016-04-12 17:09:14

标签: java apache-kafka kafka-consumer-api

使用新的Kafka Java使用者API,我运行一个消费者来消费消息。消耗掉所有可用消息后,我会使用kill -15将其删除。

现在我想重置偏移量以便开始。我想避免只使用不同的消费者群体。我尝试的是以下一系列调用,使用与刚读完数据的消费者相同的组。

assign(topicPartition);
OffsetAndMetadata om = new OffsetAndMetadata(0);
commitSync(Collections.singletonMap(topicPartition, 0));

我以为我在测试中有这个工作,但现在我总是得到:

ERROR internals.ConsumerCoordinator: Error UNKNOWN_MEMBER_ID occurred while committing offsets for group queue
Exception in thread "main" org.apache.kafka.clients.consumer.CommitFailedException: Commit cannot be completed due to group rebalance
at org.apache.kafka.clients.consumer.internals.ConsumerCoordinator$OffsetCommitResponseHandler.handle(ConsumerCoordinator.java:552)

assigncommitSync结合起来原则上是错误的,可能是因为只有subscribecommitSync在一起?文档只说assign不符合subscribe,但我认为这仅适用于一个消费者流程。 (实际上我甚至希望在另一个消费者处于启动状态时运行偏移重置消费者,希望另一个消费者可能会注意到偏移量的变化并重新开始。但是首先关闭它也很好。)

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

发现问题。鉴于我们尊重以下条件,我的问题中描述的方法很有效:

a)可能没有其他消费者使用目标group.id。即使消费者仅订阅其他主题,这也会在调用assign()而不是subscribe()后阻碍提交主题偏移。

b)在最后一个其他消费者停止之后,在操作成功之前需要30秒(我认为它是group.max.session.timeout.ms)。来自kafka的指示性日志消息是

Group X generation Y is dead and removed

一旦这出现在日志中,序列

assign(topicPartition);
OffsetAndMetadata om = new OffsetAndMetadata(0);
commitSync(Collections.singletonMap(topicPartition, 0));

可以成功。

答案 1 :(得分:1)

为什么甚至首先提交抵消? 在enable.auto.commit中将false设置为Properties,如果您只是在重新启动时重新读取所有邮件,则根本不提交。

要重置偏移量,您可以使用例如these methods

public void seek(TopicPartition partition, long offset)
public void seekToBeginning(TopicPartition... partitions)