【问题标题】:Kafka Consumer being Starved because of unbalance卡夫卡消费者因不平衡而被饿死
【发布时间】:2019-01-08 12:43:43
【问题描述】:

我是 Kafka 的新手,我认为我缺少关于分区队列如何在某个主题上保持平衡的内容

我们在一个主题上有 5 个分区和 2 个消费者。该主题有一个空键,所以我假设 Kafka 随机选择一个新分区以循环方式添加新记录。

这意味着一个消费者将从 3 个分区中读取数据,而另一个消费者将从 2 个分区中读取数据。如果我的假设是正确的(记录在分区之间得到均匀不信任),那么拥有 3 个分区的消费者将做更多的工作(多 1.5 倍)。这可能导致一个消费者什么都不做,而另一个消费者却一直在努力工作。

我认为您应该为消费者提供偶数个分区。

我错过了什么吗?

【问题讨论】:

    标签: apache-kafka kafka-consumer-api


    【解决方案1】:

    消费 Kafka 消息的并行单位是分区。消费 Kafka 消息的常规场景是使用 Apache Flink、Spark 和 Storm 等数据流处理引擎获取消息,这些引擎都在 CPU 内核上进行分布式处理。规则是每个消费者组的最大并行度可以是分区数。消费者组的每个消费者实例(例如 CPU 核心)可以使用一个或多个分区,另一方面,每个分区可以由每个消费者组的一个消费者实例使用。

    • 如果您的 CPU 内核数多于分区数,则其中一些 将是空闲的。
    • 如果您的 CPU 内核数少于分区数,则某些 它们将消耗多个分区。
    • 优化的情况是当 CPU 核心数和 Kafka 分区是相等的。

    图片可以很好地描述:

    【讨论】:

      【解决方案2】:

      如果我的假设是正确的(记录在分区之间均匀分布),那么拥有 3 个分区的消费者会做更多的工作(多出 1.5 倍)。这可能导致一个消费者什么都不做,而另一个消费者却一直在努力工作。

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

      我认为您应该为消费者提供偶数个分区。

      是的,没错。为了获得最大的并行度,您可以拥有与#partitions 一样多的消费者,例如在你的情况下,5 个消费者会给你最大的并行度。

      【讨论】:

      • 我在想的是一位消费者最终什么都不做。假设 5 个分区中的每一个都有 10 条记录(并且没有更多记录被发布),每条记录需要一秒钟。消费者 A 将处理 30 条记录,消费者 B 有 20 条记录。 20 秒后,消费者 B 有 0 条记录,而消费者 A 仍然有 10 条记录,并且将再处理 10 秒,而消费者 B 什么也不做。
      • 我不认为这是一个完全正确的类比。据我所知,从分区获取时间并不会随着分区的数量线性增长。
      • aseigneurin.github.io/2017/08/04/… 如果您查看处理大量数据的部分以及大多数记录最终位于一个分区的示例。这就是我所说的。感谢您的意见!
      • 但他们清楚地说,他们的密钥分布是倾斜的,这就是造成这种情况的原因。鉴于这个问题的上下文,我假设我们使用的是默认分区方案。如果您的分区方案本身存在偏差,则问题不是由分区/消费者数量不匹配引起的。它在别的地方。只是我的 2 美分。
      • 分区方案的目标不就是均匀分布消息吗?如果是这样,我所说的如果 5 个分区是一个糟糕的选择。应该是 4,6,8 等。可以被消费者数量整除。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在您的理解中存在一个假设,即每个分区具有完全相同的吞吐量。但是,对于大多数应用程序来说,这可能是真的,也可能不是。如果您正确设置了键控/分区,那么分区应该接近相等,特别是如果您在很长一段时间内对它们进行平均,那么分区应该接近相等,特别是对于一个大而多样的键空间。但在更实际、更现实的意义上,无论如何,您可能在任何给定时间都会有一些偏差,您的流处理设置需要容忍这种情况。因此,再为特定的消费者分配一个分区可能不会有太大的不同。

        【讨论】:

          猜你喜欢
          • 2019-10-31
          • 2022-08-08
          • 1970-01-01
          • 1970-01-01
          • 2018-12-21
          • 2019-05-08
          • 2019-07-03
          • 2018-05-05
          • 2021-08-22
          相关资源
          最近更新 更多