根据我的理解,分区和使用者被绑定为1:1关系,其中单个使用者处理分区。但是,在处理过程中是否有这种重新分区的方法? 当前,我们正在尝试优化在整个组中使用主题的过程,但是在某些情况下,某个使用者需要花费更长的时间进行数据处理,而其他使用者却已经处于空闲状态。就像数据清理一样,某个分区可能不再需要清理,而其他分区则需要模糊匹配,从而增加了用户执行的任务的复杂性。
答案 0 :(得分:1)
您对分区和消费者的理解不正确。
如果您有N个分区,则在同一使用者组中最多可以有N个使用者,每个使用者都从一个分区读取。当使用者少于分区时,某些使用者将从多个分区中读取数据。另外,如果您有更多的使用者,而不是分区,那么某些使用者将处于非活动状态,并且根本不会收到任何消息。
如果每个分区有一个使用者,那么某些分区可能会收到更多消息,这就是为什么某些使用者可能处于空闲状态而另一些使用者可能仍在处理某些消息的原因。请注意,消息并不总是以循环方式插入到主题分区中,因为具有相同密钥的消息被放入同一分区中。
答案 1 :(得分:0)
kafka中的主题已分区,即使您可以向主题添加分区,也不会重新分区:所有已写入分区的数据都将保留在其中,新数据将在现有分区之间进行分区(以循环方式)如果您未定义键,则只要不添加分区,一个键将始终位于同一分区中。)
但是,如果您有一个使用者组,并且在该组中添加或删除了使用者,则存在组重新平衡,其中每个使用者都将获得其份额的分区以专门从中使用。
因此,如果您有3个分区(在其中有均匀分布的消息)和2个使用者(在同一组中),则一个使用者要处理的消息数量是另一个分区的两倍。有3个消费者,每个消费者将消费一个分区;有4个消费者,其中一个会闲置...
因此,由于您已经具有均匀分布的消息(这很好),因此应该具有与分区一样多的使用者,如果速度还不够快,则可以添加n个分区和n个使用者。 (当然,您也可以尝试优化消费者,但这又是另一回事了……)
已添加答案:
一旦某个给定组的使用者正在使用一个分区,它将继续这样做,并且即使该组中有许多其他使用者正在使用该分区,也将是该组中唯一使用此分区的使用者。闲。在一个组中,永远不会在使用者之间共享分区。 (如果使用者崩溃,则另一人将继续工作,并且如果新使用者进入该组,则会发生重新平衡,但是无论如何在给定的时间只有一个使用者将在一个分区上工作。)
因此,如您的评论中所述,一种方法是将负载平均分配到分区上。另一种方法是,将一个主题专门讨论昂贵的工作,让它有很多分区和很多消费者。并使非昂贵工作的话题发烧友。
我不推荐的最后一种方法是不使用使用者组功能,并通过使用使用者的赋值和查找方法来管理自己从Kafka消费的方式。 (有关更多信息,请参见KafkaConsumer JavaDoc)。例如,Spark Structured Streaming正在使用该方法,但是它要复杂得多...