3

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

4

2 回答 2

6

您对分区和消费者的理解并不完全正确。

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

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

于 2019-03-19T10:58:45.367 回答
1

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

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

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

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

添加到回答评论:

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

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

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

于 2019-03-19T13:00:09.670 回答