【问题标题】:Suboptimal partitioning in Kafka consumer groupKafka 消费者组中的次优分区
【发布时间】:2020-05-11 20:33:00
【问题描述】:

我在与 Kafka 消费者合作时遇到了一个特殊的问题。当我有一个具有多个分区的主题和一个消费者组时,如果消费者数小于分区数,则消费最终会变得不平衡。例如,如果我有 8 个分区和 4 个消费者,我会看到如下内容:

Client Partition Lag
C1     P0        1000000
C1     P1        1000000
C2     P2        0
C2     P3        0
C3     P4        1000000
C3     P5        1000000
C4     P6        0
C4     P7        0

因此,有些客户的延迟为零并且什么都不做,而有些客户的延迟很大并且正在努力工作但被抛在后面。请注意,我当然可以有 8 个客户端,但考虑到我不需要 8 个客户端的工作负载,我只需要 4 个,只是 Kafka 分配分区的方式实际上只有四个中的两个可以工作。我也可以手动分配分区,但这会使应用程序逻辑复杂化很多,我对使用 Kafka 消费者组功能非常满意,除了这个烦人的平衡问题。

所以,我想知道是否有任何方法可以自动调整这一点 - 即以某种方式重新分配客户,以平均分配工作。我知道有一个proposal for something like that,但那里似乎什么也没发生。所以我想知道是否有任何方法可以在现有手段内自动完成。我现在正在使用kafka-python 驱动程序,因此理想情况下,该解决方案可以在 Python 中实现,而无需将所有系统迁移到 Java。

【问题讨论】:

    标签: apache-kafka kafka-consumer-api kafka-python


    【解决方案1】:

    不幸的是,没有办法保证绝对平衡,您需要为消费者组中的每个消费者手动配置分区分配。

    如果您使用的是 kafka-python 驱动程序,它可能类似于下面的示例......

    >>> # manually assign the partition list for the consumer
    >>> from kafka import TopicPartition
    >>> consumer = KafkaConsumer(bootstrap_servers='localhost:1234')
    >>> consumer.assign([TopicPartition('foobar', 2)])
    >>> msg = next(consumer)
    

    查看更多链接:https://kafka-python.readthedocs.io/en/master/

    第二个链接很好地概述了不同的分区分配策略,但请注意示例是用 Java 编写的:https://medium.com/streamthoughts/understanding-kafka-partition-assignment-strategies-and-how-to-write-your-own-custom-assignor-ebeda1fc06f3

    希望对您有所帮助,如果您需要更多详细信息,请发表评论!

    【讨论】:

    • 我不是在寻找绝对平等,但是当一些消费者闲置数小时而其他人正在处理双重工作量时,这变得很荒谬,并且再平衡也无济于事。我当然可以手动管理分区,但使用 Kafka 的全部目的是让自己免于这样做……可能我必须编写自己的分配器。我希望某些东西已经存在......
    • 让我们期待未来的版本!我看过各种博客对这个问题的评论。我认为 Jeppe Andersen 的解释很好:nocture.dk/2019/10/27/kafka-my-consumer-group-is-not-balanced
    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 2014-10-25
    • 2020-05-09
    • 1970-01-01
    • 2017-10-17
    • 2018-10-03
    • 1970-01-01
    • 2016-04-13
    相关资源
    最近更新 更多