【问题标题】:Kafka repartitioning卡夫卡重新分区
【发布时间】:2020-11-02 06:50:11
【问题描述】:

据我了解,分区和消费者被捆绑成 1:1 的关系,其中单个消费者处理一个分区。但是,有没有这样一种方法可以在处理过程中重新分区? 我们目前正在尝试优化主题在整个组中被消费的过程,但在某些情况下,数据处理需要在某个消费者身上花费更长的时间,而其他消费者已经处于空闲状态。就像数据清理一样,某个分区可能不再需要清理,而其他分区则需要模糊匹配,从而增加了消费者执行任务的复杂性。

【问题讨论】:

    标签: apache-kafka kafka-consumer-api


    【解决方案1】:

    您对分区和消费者的理解不太正确。

    如果你有 N 个分区,那么在同一个消费者组中最多可以有 N 个消费者,每个消费者都从一个分区中读取。当您的消费者少于分区时,一些消费者将从多个分区中读取。此外,如果您的消费者多于分区,那么一些消费者将处于非活动状态并且根本不会收到任何消息。

    如果每个分区有一个消费者,那么某些分区可能会收到更多消息,这就是为什么您的一些消费者可能处于空闲状态而另一些可能仍在处理一些消息的原因。请注意,消息并不总是以循环方式插入到主题分区中,因为具有相同键的消息被放置到同一个分区中。

    【讨论】:

    • 那你是说要增加分区数?正确的消息均匀分布在分区中。
    • 我并不是说要增加分区数。我试图解释 Kafka 在消费者、消费者组和分区方面是如何工作的。
    【解决方案2】:

    在 kafka 中,主题是分区的,即使您可以将分区添加到主题,也不会重新分区:已写入分区的所有数据都保留在那里,新数据将在现有分区之间进行分区(以循环方式如果你不定义keys,否则只要你不添加partition,一个key总是会落在同一个partition中。)

    但是,如果您有一个消费者组,并且您向该组添加或删除消费者,则会出现一个组重新平衡,其中每个消费者接收其分区份额以独占消费。

    因此,如果您有 3 个分区(它们之间的消息分布均匀)和 2 个消费者(在同一个组中),那么一个消费者要处理的消息将是另一个消费者的两倍;有 3 个消费者,每个消费者将消耗一个分区;有 4 个消费者,其中一个将保持空闲状态...

    因此,由于您已经拥有均匀分布的消息(这很好),您应该拥有与分区一样多的消费者,如果仍然不够快,您可以添加 n 个分区和 n 个消费者。 (当然你也可以尝试优化消费者,但那是另一回事......)

    添加到回答评论:

    一旦来自给定组的消费者正在消费一个分区,它将继续这样做,并且将是该组中唯一一个消费该分区的消费者,即使来自同一组的许多其他消费者也在闲置的。在一组中,消费者之间永远不会共享分区。 (如果消费者崩溃,另一个消费者会继续工作,如果有新消费者进入群组,则会发生重新平衡,但无论如何,在给定时间只有一个消费者会在一个分区上工作)。

    因此,正如您在评论中所说的那样,一种方法是将负载均匀地分布在分区上。另一种方法是有一个专门用于昂贵作业的主题,让它有很多分区和很多消费者;并让非昂贵工作的话题引起消费者的热议。

    我不推荐的最后一种方法是不使用消费者组功能,并通过使用消费者的分配和查找方法来管理自己如何从 Kafka 消费。 (有关更多信息,请参阅KafkaConsumer JavaDoc)。例如,Spark Structured Streaming 正在使用这种方法,但它要复杂得多......

    【讨论】:

    • 是的,问题基本上是消费者以不可预测的方式完成任务。您有什么建议可以在空闲消费者之间重新分配分区?我们正在考虑创建各种主题并应用过滤器,以便“复杂”的主题不会聚集在一起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多