我已经在Kafka用户邮件列表上发布了这个,但没有得到任何回复,所以我想我也会在这里尝试。
我目前正在尝试升级我的软件以使用0.8.2中的Kafka 0.9。我在尝试着 切换到新的Consumer API,以便在添加或删除计算机时进行重新平衡 来自我们的集群。我遇到了一个主题相同分区的问题 将机器添加到组中时,将短时间分配给多个消费者。 这导致一些消息被处理多次,而我的目标是 一次。我按照Javadocs中的设置说明操作并使用外部数据存储 在消费和重新平衡时保存偏移量。
在我的测试集群中,我最初开始使用2台机器和一台生产商。一切 在开始时工作正常,每个消费者获得一半的分区。当我添加第三个 机器它被分配了一部分分区但这些分区没有被撤销 两台初始机器中的一台。以下是我的程序中的一些日志声明,希望如此 它们有助于说明我的情况。
分区14最初分配给机器1.机器1之前读取许多消息 机器3被添加。分区14在启动时分配给机器3,但是分区14是 没有从机器1撤销。两台机器然后在偏移3之前读取相同的消息 系统重新平衡,并且都可以访问已撤销的分区14。然后分配机器2 分区14从机器1撤销后仍然分配给机器3 它从机器3中撤销,机器2是唯一可以访问分区14的机器。
机器1(开始时打开)
2016-08-24 14:17:08 DEBUG KafkaStreamReader:351 - ASSIGNED: Assigning partition 14 for topic
assignments to worker with offset 0
2016-08-24 14:18:48 DEBUG KafkaStreamReader:312 - Committing topic assignments partition 14
offset 3
2016-08-24 14:19:38 DEBUG KafkaStreamReader:200 - partition = 14, offset = 3 (Message read
from kafka)
2016-08-24 14:19:38 DEBUG KafkaStreamReader:312 - Committing topic assignments partition 14
offset 4
2016-08-24 14:19:39 DEBUG KafkaStreamReader:338 - REVOKED: Committing for partition 14 of
topic assignments offset 4
机器2(开始时打开)
2016-08-24 14:19:51 DEBUG KafkaStreamReader:351 - ASSIGNED: Assigning partition 14 for topic
assignments to worker with offset 4
机器3(几分钟后开启)
2016-08-24 14:19:21 DEBUG KafkaStreamReader:351 - ASSIGNED: Assigning partition 14 for topic
assignments to worker with offset 3
2016-08-24 14:19:48 DEBUG KafkaStreamReader:200 - partition = 14, offset = 3 (Message read
from kafka - already read by machine 1)
2016-08-24 14:20:00 DEBUG KafkaStreamReader:338 - REVOKED: Committing for partition 14 of
topic assignments offset 4
我的群集正在使用Kafka版本2.0.1-1.2.0.1.p0.5运行Cloudera 5.7.0 到Kafka版本0.9.0.0 + kafka2.0.1 + 283。 (https://www.cloudera.com/documentation/kafka/latest/topics/kafka_packaging.html)
任何人都可以帮忙解释我在这里做错了什么吗?如果有任何进一步的信息我可以 提供帮助,请告诉我,如果可以的话,我很乐意提供。