我有一个主题,有 3 个分区,只有 1 个使用者,并且我使用默认分区器,在本例中为“粘性”。其他一切都默认。
从生产者发送的数据没有密钥,我也不希望它有密钥,我只是希望每个数据都进入一个随机分区,并使这些数据均匀分布。
但是我得到了与此类似的结果,其中一个分区远远高于其他分区
因此我有两个问题。
我尝试创建一个自定义分区程序,它查看每个分区的大小并将数据分配给数据较少的地方。这可能吗?
Kafka 文档对此进行了解释:
DefaultPartitioner 现在使用粘性分区策略。这 表示特定主题的记录具有空键且未分配 分区将被发送到同一个分区,直到批次准备好 将被寄出。创建新批次时,会选择一个新分区。 这减少了生成的延迟,但可能会导致不均匀 边缘情况下跨分区的记录分布。一般来说 用户不会受到影响,但这种差异可能会在 测试和其他产生极少量记录的情况 时间。
切换到 RoundRobinPartitionner(而不是 DefaultPartitionner)可能就是您想要的。请参阅https://kafka.apache.org/documentation/# Producerconfigs_partitioner.class我忽略了消息速率的恒定程度,但在正常情况下(生产)默认分区器是相当公平的。
还要确保
linger.ms
为 0
并尽可能减少 batch.size
。
实现自定义分区器相当简单。但知道哪个分区较小比较困难,因为它会经常发生变化。您最终可能会花费更多时间刷新分区大小,并找到发送消息的最小分区。
我注意到同样的问题,似乎他们将默认分区从循环更改为粘性分区。似乎找不到任何关于如何将其改回循环赛的明显信息!这很烦人。