Apache Kafka - 跨磁盘和代理的负载不均匀

时间:2016-05-12 02:57:31

标签: apache-kafka

我在EC2上运行2x代理Kafka设置,每个设置有4x4GB GP2 SSD,主题有6个分区和1个副本。它们驱动器已挂载,我已将它们设置在server.properties中。但是当我负载测试我的系统并看到驱动器发生了什么时,代理1上的4个驱动器中的1个已经存储了大量数据,例如我得到的数据:

经纪人1:**注意:我为*** ***手动复制了mount / a的数字

Filesystem      Size  Used Avail Use% Mounted on
udev             16G   12K   16G   1% /dev
tmpfs           3.2G  344K  3.2G   1% /run
/dev/xvda1      7.8G  1.3G  6.1G  17% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            5.0M     0  5.0M   0% /run/lock
none             16G     0   16G   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/xvdg       3.9G  8.0M  3.6G   1% /b
/dev/xvdf       3.9G  600M  3.2G   17% /a
/dev/xvdh       3.9G  8.0M  3.6G   1% /c
/dev/xvdi       3.9G  8.0M  3.6G   1% /d

经纪人2:

Filesystem      Size  Used Avail Use% Mounted on
udev             16G   12K   16G   1% /dev
tmpfs           3.2G  344K  3.2G   1% /run
/dev/xvda1      7.8G  1.3G  6.1G  17% /
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none            5.0M     0  5.0M   0% /run/lock
none             16G     0   16G   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/xvdg       3.9G  8.0M  3.6G   1% /b
/dev/xvdf       3.9G  8.0M  3.6G   1% /a
/dev/xvdh       3.9G  8.0M  3.6G   1% /c
/dev/xvdi       3.9G  8.0M  3.6G   1% /d

有人可以解释发生了什么,以及我是否设置了错误的内容?我以为它们应该在所有驱动器上大致相同?

1 个答案:

答案 0 :(得分:3)

当您通过Kafka发送负载时,生产者对发送的密钥集使用Partitioner实现,以便确定将消息写入哪个分区。默认的Partitioner实现使用散列函数。如果您使用相同的密钥发送所有消息,那么它们将全部散列到同一分区。对于一小组键也是如此 - 散列通常会产生不均匀的分布。

您最好的选择是使用更大的密钥集,或者使用可以执行更均匀的消息分发的分区程序配置生产者 - 例如通过循环法。这是否是您想要做的事情取决于您是否要求确保按顺序处理某些消息,在这种情况下,您应确保相关消息使用相同的密钥,并在分区程序中考虑这一点。