2017-05-03 36 views
0

这个解释在卡夫卡10中仍然有效吗?当未指定分区键时,为什么数据在分区间不均匀分布?

在Kafka生产者中,可以指定一个分区键来表示消息的目标分区。默认情况下,基于散列的分区程序用于确定给定密钥的分区标识,人们也可以使用自定义分区程序。 要减少开放套接字的数量,在0.8.0(https://issues.apache.org/jira/browse/KAFKA-1017)中,当未指定分区键或为空时,制作者将选择一个随机分区并在切换到另一个分区之前坚持一段时间(默认为10分钟)一。因此,如果生产者数量少于分区数量,那么在某个特定时间点,某些分区可能不会收到任何数据。为了缓解这个问题,可以减少元数据刷新间隔,或者指定消息密钥和定制的随机分区。欲了解更多详细信息,请参阅此线程http://mail-archives.apache.org/mod_mbox/kafka-dev/201310.mbox/%3CCAFbh0Q0aVh%2Bvqxfy7H-%2BMnRFBt6BnyoZk1LWBoMspwSmTqUKMg%40mail.gmail.com%3E

从这里https://cwiki.apache.org/confluence/display/KAFKA/FAQ#FAQ-Whyisdatanotevenlydistributedamongpartitionswhenapartitioningkeyisnotspecified

回答

0

新生产者已更改为使用循环策略。也就是说,如果没有指定密钥,消息将均匀地传送到所有分区。

+0

给定空键,我认为老生产者也使用循环赛策略。它产生一个分区10分钟,然后切换到另一个分区。因此,在某些情况下,如果生产者的线程数为1,那么数据并不是均匀分布的。比方说,1.新的实现使记录在所有分区间均匀分布? – Tong

+0

如果没有提供密钥并且缓存中不包含该主题的分区信息,则旧生产者会随机选择一个分区,因此很难以循环方式进行操作。请参阅kafka.producer.async.DefaultEventHandler.getPartition方法 – amethystic