Storm-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应分配的任务数。 每个任务都将在群集周围某个进程中的某个线程上运行。
我在暴风雨用户中遇到了一个讨论相似问题的讨论。
读取Spout并行度与kafka分区数量之间的关系 。
使用kafka-spout进行风暴时需要注意的2件事
- 您可以在KafkaSpout上拥有的最大并行度是分区数 。
- 我们可以将负载拆分为多个kafka主题,并为每个主题分别设置spout实例 。 即。 每个喷口处理一个单独的主题 。
因此,如果我们有一个案例,其中每个主机的kafka分区配置为1,主机数为2.即使我们将spout parallelism设置为10,所需的最大值也只是2,即分区数。
如何提及Kafka-spout中的分区数量?
List hosts = new ArrayList (); hosts.add(new HostPort("localhost",9092)); SpoutConfig objConfig=new SpoutConfig(new KafkaConfig.StaticHosts(hosts, 4), "spoutCaliber", "/kafkastorm", "discovery");
如您所见,此处可以使用hosts.add
添加hosts.add
并且在new KafkaConfig.StaticHosts(hosts, 4)
代码段中将分区号指定为4 。
如何提及Kafka喷口的平行度暗示?
builder.setSpout("spout", spout,4);
您可以在使用setSpout
方法将setSpout
添加到拓扑中时提及相同内容。 这里4 是并行性提示 。
更多可能有用的链接
了解最并行性的-A-风暴拓扑
什么-是-在任务function于Twitter的风暴并行
免责声明 :!! 我是风暴和java的新手!!!! 所以请编辑/添加,如果它需要一些在哪里。