kafka 中的分区不均匀/无密钥

问题描述 投票:0回答:2

我有一个主题,有 3 个分区,只有 1 个使用者,并且我使用默认分区器,在本例中为“粘性”。其他一切都默认。

从生产者发送的数据没有密钥,我也不希望它有密钥,我只是希望每个数据都进入一个随机分区,并使这些数据均匀分布。

但是我得到了与此类似的结果,其中一个分区远远高于其他分区 Muestra

因此我有两个问题。

  • 为什么会发生这种事?
  • 怎样才能让分区再次相等?

我尝试创建一个自定义分区程序,它查看每个分区的大小并将数据分配给数据较少的地方。这可能吗?

java apache-kafka apache-kafka-streams spring-kafka
2个回答
0
投票

Kafka 文档对此进行了解释:

DefaultPartitioner 现在使用粘性分区策略。这 表示特定主题的记录具有空键且未分配 分区将被发送到同一个分区,直到批次准备好 将被寄出。创建新批次时,会选择一个新分区。 这减少了生成的延迟,但可能会导致不均匀 边缘情况下跨分区的记录分布。一般来说 用户不会受到影响,但这种差异可能会在 测试和其他产生极少量记录的情况 时间。

切换到 RoundRobinPartitionner(而不是 DefaultPartitionner)可能就是您想要的。请参阅https://kafka.apache.org/documentation/# Producerconfigs_partitioner.class我忽略了消息速率的恒定程度,但在正常情况下(生产)默认分区器是相当公平的。

还要确保

linger.ms
0
并尽可能减少
batch.size

实现自定义分区器相当简单。但知道哪个分区较小比较困难,因为它会经常发生变化。您最终可能会花费更多时间刷新分区大小,并找到发送消息的最小分区。


0
投票

我注意到同样的问题,似乎他们将默认分区从循环更改为粘性分区。似乎找不到任何关于如何将其改回循环赛的明显信息!这很烦人。

© www.soinside.com 2019 - 2024. All rights reserved.