我有一个主题,有 10 个分区,1 个消费者组,有 4 个消费者,工作线程大小为 3。
我可以看到分区中的消息分布不均匀,一个分区有太多数据,而另一个分区是空闲的。
如何让我的生产者将负载均匀分配到所有分区,以便所有分区都得到正确利用?
根据DefaultPartitioner类本身的JavaDoc注释,默认的分区策略是:
- 如果记录中指定了分区,则使用它。
- 如果未指定分区但存在密钥,则根据密钥的哈希值选择分区。
- 如果不存在分区或键,则以循环方式选择分区。
https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/ Producer/internals/DefaultPartitioner.java https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/producer/internals/DefaultPartitioner.java
因此,这里有两个可能导致分布不均匀的原因,具体取决于您在生成消息时是否指定密钥:
如果您指定一个键并且使用 DefaultPartitioner 得到不均匀的分布,最明显的解释是您多次指定相同的键。
如果您没有指定键并使用 DefaultPartitioner,则可能会发生不明显的行为。根据上面的内容,您会期望消息的循环分发,但情况不一定如此。 0.8.0 中引入的优化可能会导致使用相同的分区。检查此链接以获取更详细的说明:https://cwiki.apache.org/confluence/display/KAFKA/FAQ#FAQ-当未指定分区键时,为什么数据不会均匀分布在分区中? https://cwiki.apache.org/confluence/display/KAFKA/FAQ#FAQ-Whyisdatanotevenlydistributedamongpartitionswhenapartitioningkeyisnotspecified? .
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)