卡夫卡消费者因不平衡而挨饿

时间:2018-08-01 03:21:38

标签: apache-kafka kafka-consumer-api

我是Kafka的新手,认为我在分区队列如何在某个主题上保持平衡方面缺少了一些东西

我们在一个主题上有5个分区和2个使用者。该主题具有空键,因此我假设Kafka随机选择一个新分区,以循环方式将新记录添加到其中。

这意味着一个使用者将读取3个分区,而另一个则从2个读取。如果我的假设是正确的(记录在各个分区之间均不可信),则3个分区的使用者将做更多的工作(多1.5倍)。这可能导致一个消费者无所事事,而另一个则继续努力。

我认为您应该为消费者分配均匀数量的分区。

我想念什么吗?

4 个答案:

答案 0 :(得分:0)

使用Kafka消息时并行性的单位是分区。消耗Kafka消息的常规情况是使用数据流处理引擎(如Apache Flink,Spark和Storm)获取消息,它们全部都在CPU内核上进行分布式处理。规则是每个使用者组的最大并行度可以是分区数。使用者组的每个使用者实例(例如CPU内核)可以使用一个或多个分区,另一方面,每个使用者组的仅一个使用者实例可以使用每个分区。

  • 如果您的CPU内核数量超过分区数,则其中一些分区 将处于空闲状态。
  • 如果您的CPU内核数少于分区数,则某些 它们将消耗多个分区。
  • 最优化的情况是当CPU内核数和 卡夫卡的分区是相等的。

图像可以很好地描述: enter image description here

答案 1 :(得分:0)

  

如果我的假设正确(记录在各个分区之间均匀分布),则拥有3个分区的使用者将做更多的工作(多1.5倍)。这可能导致一个消费者无所事事,而另一个则继续努力。

为什么一个消费者什么都不做?它仍将处理这两个分区中的记录[当然,假设两个使用者都在同一组中]

  

我认为您应该为消费者分配均匀数量的分区。

是的,没错。为了获得最大的并行度,您可以拥有与#partitions一样多的使用者,例如在您的情况下,有5个使用者将为您提供最大的并行度。

答案 2 :(得分:0)

您的理解是正确的。可能存在数据偏斜。您可以使用偏移量检查器或其他工具检查每个分区中有多少条记录。

答案 3 :(得分:0)

您的理解中包含一个假设,即每个分区的吞吐量完全相同。但是,对于大多数应用程序,这可能是正确的,也可能不是。如果您设置了密钥/分区权限,则希望分区应该接近相等,尤其是如果您将它们在很长一段时间内平均下来,则具有较大且多样化的密钥空间。但是从更实际,更现实的意义上讲,无论如何在任何给定时间都可能会有一些偏差,并且您的流处理设置将需要允许这种偏差。因此,再为一个特定的消费者分配一个分区可能不会有太大的不同。