Storm-Kafka 多个 spout,如何分担负载?

Posted

技术标签:

【中文标题】Storm-Kafka 多个 spout,如何分担负载?【英文标题】:Storm-Kafka multiple spouts, how to share the load? 【发布时间】:2013-08-18 12:52:41 【问题描述】:

我正在尝试在多个 spout 之间共享任务。我有一种情况,我一次从外部源获取一个元组/消息,并且我想要一个 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!为什么?

根据StormDocssetSpout()声明如下:

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

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

【问题讨论】:

【参考方案1】:

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

阅读Relationship between Spout parallelism and number of kafka partitions。


使用 kafka-spout forstorm 时需要注意的 2 件事

    KafkaSpout 可以拥有的最大并行度是分区数。 我们可以将负载拆分为多个 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 添加代理,并且在new KafkaConfig.StaticHosts(hosts, 4) 代码sn-p 中将分区号指定为4


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

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

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


更多可能有帮助的链接

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

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


免责声明: !!我是storm和java的新手!!!!所以请编辑/添加如果它需要在某个地方。

【讨论】:

哦……你是上帝派来的。你救了我的命。我有 5 个 kafka 分区,我在 setSpout() 中将 parallelism_hint 设置为 3,并且想知道为什么在将 parallelism_hint 设置为 5 解决了我的问题后,我的拓扑结构只从 3 个 kafka 分区中读取。感谢您指出这一点。

以上是关于Storm-Kafka 多个 spout,如何分担负载?的主要内容,如果未能解决你的问题,请参考以下文章

storm-kafka

storm-kafka 访问带 kerberos 权限的 kafka

storm如何分配任务和负载均衡?

无法弄清楚如何使用适用于 Linux 和 composer 的 Windows 子系统运行 box\Spout

如何将两个不同 Spout 的输出发送到同一个 Bolt?

storm trident 如何标记一个batch被处理——coordinator spout