CommitFailedException:由于组重新平衡,无法完成提交

时间:2016-09-28 11:07:58

标签: apache-kafka kafka-consumer-api

我使用的是kafka 0.9.0.1经纪人 0.9.0.1消费者客户端。我的消费者实例正在消耗处理时间少于1秒的记录。其他主要配置是

enable.auto.commit=false
session.timeout.ms=30000
heartbeat.interval.ms=25000

我在处理后提交偏移量。 我得到了例外

  

在为组提交偏移时发生错误UNKNOWN_MEMBER_ID   kafka_to_s3

     

错误com.bsb.hike.analytics.consumer.Consumer - 无法提交   retryCount = 2 org.apache.kafka.clients.consumer.CommitFailedException:   由于组重新平衡,无法完成提交

一小时一到两次。每天消耗大约60亿个事件。似乎偏移仅存储在主题“__consumer_offsets”的一个分区中。它还会增加特定代理的负载。

有人对这些问题有所了解吗?

1 个答案:

答案 0 :(得分:4)

如果Kafka在会话超时内没有收到至少一个心跳,则会触发重新平衡。如果触发了重新平衡,则提交将失败。这是预料之中的。所以问题是为什么没有发生心跳?可能有几个原因。

  1. 首先,您正在进行手动提交。从0.9开始,心跳不会发生在单独的线程中。使用者在一个线程上运行,该线程处理提交,心跳和轮询。因此,当您执行consumer.poll()或consumer.commit()时会发生心跳。因此,如果您的处理时间超过会话超时,则可能导致心跳失败。

  2. kafka 0.9消费者中存在一个已知问题,可能会导致您遇到的问题。

  3. https://issues.apache.org/jira/browse/KAFKA-3627

    在任何一种情况下,将您的消费者降级到0.8都可以解决问题。

    编辑:你可以尝试将会话时间增加到5分钟,看看它是否有效。

    关于kafka配置

    Kafka服务器期望它在会话超时内至少收到一个心跳。因此,消费者最多尝试进行心跳(会话超时/心跳次数)。可能会错过一些心跳。因此,您的心跳时间不应超过会话超时时间的1/3。 (您可以参考文档)