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

Nat*_*Uni 2 apache-kafka

我在 EC2 上运行 2 个代理 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
Run Code Online (Sandbox Code Playgroud)

经纪人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
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下发生了什么以及我是否设置错误吗?我认为它们在所有驱动器上应该是大约均匀的?

Jak*_*rab 5

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

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