【发布时间】:2017-09-19 09:02:13
【问题描述】:
我需要来自 kafka 代理的数据,但为了快速访问,我使用了多个具有相同组 id 的消费者,称为消费者组。但是在每个消费者阅读之后,我们如何合并来自多个消费者的数据?有什么逻辑吗?
【问题讨论】:
标签: apache-kafka kafka-consumer-api consumer
我需要来自 kafka 代理的数据,但为了快速访问,我使用了多个具有相同组 id 的消费者,称为消费者组。但是在每个消费者阅读之后,我们如何合并来自多个消费者的数据?有什么逻辑吗?
【问题讨论】:
标签: apache-kafka kafka-consumer-api consumer
根据设计,同一消费者组中的不同消费者彼此独立地处理数据。 (这种行为使应用程序能够很好地扩展。)
但是在每个消费者读取之后,我们如何组合来自多个消费者的数据呢?有什么逻辑吗?
当您使用 Kafka 的“Consumer API”(也称为:“consumer client”库)时,简短但略微简化的答案,我认为这是您根据问题的措辞使用的:如果您需要合并数据来自多个消费者,最简单的选择是让这个(新的)输入数据在另一个 Kafka 主题中可用,您可以在后续处理步骤中进行组合。一个简单的例子是:另一个,第二个 Kafka 主题将被设置为只有 1 个分区,因此任何后续处理步骤都会看到所有需要组合的数据。
如果这听起来有点太复杂,我建议使用 Kafka 的 Streams API,它可以更轻松地定义此类处理流程(例如,连接或聚合,就像您的问题一样)。换句话说,Kafka Streams 为您提供了许多您正在寻找的所需内置“逻辑”:https://kafka.apache.org/documentation/streams/
【讨论】:
Kafka 的目标是为您提供可扩展、高性能和容错的框架。让一组消费者异步读取来自不同分区的数据允许您归档前两个目标。数据的分组有点超出标准 Kafka 流程的范围——在最简单的情况下,您可以使用单个使用者实现单个分区,但我确定这不是您想要的。
对于诸如聚合来自不同消费者的单一状态之类的事情,我建议您应用一些专门为此类目标设计的解决方案。如果您使用 Hadoop,您可以使用 Storm Trident bolt,它允许您聚合来自 Kafka spout 的数据。或者您可以使用 Spark Streaming,它可以让您做同样的事情,但方式有所不同。或者作为一个选项,您始终可以使用标准 Kafka 库来实现具有此类逻辑的自定义组件。
【讨论】: