Kafka不会在主题

时间:2015-07-12 20:37:12

标签: java multithreading consumer apache-kafka producer

我希望有10个分区的1个主题。我正在使用Kafka的默认配置。我通过帮助程序脚本创建了10个包含10个分区的主题,现在我将要向它生成消息。

事情是,似乎只有5个分区,消费者从中获取数据。

让我们更详细地描述一下。

我知道每个分区需要一个消费者线程的常见内容。我希望能够为每个分区提交偏移量,这只有在每个分区每个消费者连接器有1个线程时才有可能(我使用的是高级消费者)。

所以我创建了10个线程,在每个线程中我调用的是Consumer.createJavaConsumerConnector(),我在这里做

topicCountMap.put("mytopic", 1);

最后我有1个迭代器,它消耗来自1个分区的消息。

当我这样做10次时,我有10个消费者,每个分区的每个线程的消费者,我可以在每个分区独立提交偏移量,因为如果我在主题图中添加不同的数字,我最终会有超过1个消费者线程对于那个主题,所以如果我要使用创建的消费者实例提交偏移量,它会为所有不需要的线程提交它们,因此对于不需要的多个分区。

但问题是,当我使用消费者时,只涉及5个消费者,似乎其他线程闲置但我不知道为什么。

第一个可能的原因是,即使我有10个分区,只有5个分区有消息,所以其他5个消费者都处于空闲状态,但我不明白当我使用生产者时,消息在所有分区中均匀分布的可能性如何。我发送了大约1M的消息,所以如果说它们是均匀分布的,那么每个parmition 必须至少包含一些消息。

//编辑

我设法在一个主题中创建了10个分区,但我只有7个消费者。这对我来说只是一个奇迹。

问题是我在循环中创建这些消费者线程。所以我开始第一个线程(提交给执行者服务),然后是另一个,然后是另一个,依此类推。

所以场景是第一个消费者获得所有10个分区,然后是第二个连接,因此它在这两个分区之间分成5和5(或类似的东西),然后其他线程连接。

我将此理解为所有消费者之间的分区重新平衡,因此它在这种意义上表现良好,如果创建更多消费者,则在这些消费者之间进行分区平衡,以便每个消费者都应该有一些分区来操作。

但是从结果中我看到只有7个消费者,并且根据消费消息,它们看起来像分区3,2,1,1,1,1,1分开。是的,这7个消费者覆盖了所有10个分区,但为什么拥有1个以上分区的消费者不会拆分并为剩下3个消费者提供分区?

我非常想知道剩下的3个线程发生了什么,以及为什么他们没有从拥有超过1个分区的消费者“抓取”分区。

1 个答案:

答案 0 :(得分:0)

我在通过管理脚本创建主题之前(意外地)以编程方式访问主题时看到了类似的行为。在这种情况下,分区数以及其他主题配置设置默认为broker.config中的值