从单个Kafka主题消耗的多个风暴拓扑

问题描述 投票:0回答:1

Storm状态提供的性能调整文档提供了绝对最佳的性能扩展多个并行拓扑,可以产生比简单扩展工作人员更好的性能。

我正在尝试将这一理论与规模化工人进行比较。

但是,使用1.2.1版,风暴卡夫卡喷口的运行方式却不如我在多种不同拓扑结构中所期望的那样。

为单个主题的所有拓扑为kafka spout消费者设置一个公共的client.id和group.id,每个拓扑仍订阅所有可用的分区和重复的元组,并在重新提交已提交的元组时引发错误。

我为这种行为感到惊讶,因为我认为消费者API将支持这种相当简单的用例。

如果有人能解释我将非常感谢

  1. 使用kafka喷口的这种行为的实现逻辑是什么?
  2. 解决此问题的方法吗?
apache-kafka apache-storm
1个回答
0
投票

喷口的默认行为是使用KafkaConsumer.assign API将主题的所有分区分配给拓扑中的工作程序。这是您看到的行为。由于这种行为,您不应该在拓扑之间共享组ID。

如果要更好地控制将哪些分区分配给哪些工作器或拓扑,可以实现TopicFilter接口,并将其传递给KafkaSpoutConfig。这应该让您做您想做的事。

关于更快地运行多个拓扑,我假设您是从文档中引用本节的:In multiworker mode, messages often cross worker process boundaries. For performance sensitive cases, if it is possible to configure a topology to run as many single-worker instances [...] it may yield significantly better throughput and latency。此处的目的是避免在工作进程之间发送消息,而是将每个分区的内部处理保持在一个工作进程内部。如果您想避免运行许多拓扑,可以考虑自定义Storm调度程序以使其分配例如每个工人中管道的完整副本。这样,如果您使用localOrShuffleGrouping,将始终有本地螺栓要发送到,因此您不必通过网络传递给其他工作人员。

© www.soinside.com 2019 - 2024. All rights reserved.