Storm-Kafka多个鲸鱼喷水,如何分担负荷?

时间:2013-08-16 07:16:06

标签: java load-balancing apache-storm apache-kafka

我正在尝试在多个喷口之间分享任务。我有一种情况,我从外部来源一次得到一个元组/消息,我希望有多个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应分配的任务数。每个任务都将在集群中某个进程的某个线程上运行。

1 个答案:

答案 0 :(得分:18)

我在storm-user中遇到了一个讨论相似问题的讨论。

阅读Relationship between Spout parallelism and number of kafka partitions


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

  1. 您在KafkaSpout上可以拥有的最大并行度分区数
  2. 我们可以将加载拆分为多个kafka主题,并为每个分别设置个spout实例。即。 处理单独主题的每个喷口
  3. 因此,如果我们有一个案例,其中每个主机的kafka分区配置为1,主机数为2.即使我们将spout parallelism设置为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添加代理,并在new KafkaConfig.StaticHosts(hosts, 4)代码段中将分区号指定为 4


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

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

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


    更多可能有用的链接

    Understanding-the-parallelism-of-a-Storm-topology

    what-is-the-task-in-twitter-storm-parallelism


    <强>声明: !我是风暴和java的新手!!!!所以请编辑/添加,如果它需要一些地方。