10

我正在尝试在多个喷口之间共享任务。我有一种情况,我一次从外部源获取一个元组/消息,并且我想要一个 spout 的多个实例,背后的主要目的是分担负载并提高性能效率。

我可以对一个 Spout 本身做同样的事情,但我想在多个 Spout 之间共享负载。我无法获得分散负载的逻辑。因为在特定的 spout 完成消费部分(即基于缓冲区大小设置)之前,消息的偏移量是未知的。

任何人都可以对如何解决逻辑/算法提出一些亮点吗?

提前感谢您的时间。


响应答案更新:
现在在 Kafka 上使用了多分区(即5
以下是使用的代码:
builder.setSpout("spout", new KafkaSpout(cfg), 5);

800 MB通过在每个分区上充斥数据进行测试,并~22 sec完成读取。

再次,使用parallelism_hint = 1的代码,
builder.setSpout("spout", new KafkaSpout(cfg), 1);

现在需要更多~23 sec!为什么?

根据 Storm Docs setSpout() 声明如下:

public SpoutDeclarer setSpout(java.lang.String id,
                              IRichSpout spout,
                              java.lang.Number parallelism_hint)

其中,
parallelism_hint - 应该分配给执行这个 spout 的任务数。每个任务将在集群周围某处的进程中的线程上运行。

4

1 回答 1

18

我在storm-user中遇到过一个讨论,其中讨论了类似的内容。

读取Spout 并行度与 kafka 分区数之间的关系


使用 kafka-spout 进行风暴时需要注意的 2 件事

  1. 您可以在 KafkaSpout 上拥有的最大并行度是分区数
  2. 我们可以将负载拆分为多个 kafka 主题,并为每个主题设置单独的 spout 实例。IE。每个 spout 处理一个单独的主题

因此,如果我们有这样一种情况,每个主机的 kafka 分区配置为 1,主机数量为 2。即使我们将 spout 并行度设置为 10,所接受的最大值也只会是 2,即分区数。


如何提及 Kafka-spout 中的分区数?

List<HostPort> hosts = new ArrayList<HostPort>();
hosts.add(new HostPort("localhost",9092));
SpoutConfig objConfig=new SpoutConfig(new KafkaConfig.StaticHosts(hosts, 4), "spoutCaliber", "/kafkastorm", "discovery");

如您所见,可以在此处添加代理,并且在代码片段hosts.add中将分区号指定为4 。new KafkaConfig.StaticHosts(hosts, 4)


如何在 Kafka-spout 中提及并行提示?

builder.setSpout("spout", spout,4);

setSpout您可以在使用方法将 spout 添加到拓扑中时提及相同的内容。这里4 是并行提示


更多可能有帮助的链接

理解风暴拓扑的并行性

twitter-storm-parallelism 中的任务是什么


免责声明:!!我是storm和java的新手!!!!因此,如果在某些地方需要,请编辑/添加。

于 2013-08-16T13:32:08.273 回答