ApacheStorm:以编程方式向远程集群提交拓扑,而不创建jar

nimxete2  于 2021-06-21  发布在  Storm
关注(0)|答案(1)|浏览(609)

这是我第一次使用apachestorm,我有以下问题。对于我的应用程序,我有一个要求,即对于使用我的应用程序的每个用户,拓扑图是不同的,并且每个用户也可以有多个拓扑图。
因此,我想到了使用拓扑生成器动态创建拓扑图。例如,使用storm的Topology示例,这将是:

TopologyBuilder builder = new TopologyBuilder();

builder.setSpout("1", new TestWordSpout(true), 5);
builder.setSpout("2", new TestWordSpout(true), 3);
builder.setBolt("3", new TestWordCounter(), 3)
        .fieldsGrouping("1", new Fields("word"))
        .fieldsGrouping("2", new Fields("word"));
builder.setBolt("4", new TestGlobalCount())
        .globalGrouping("1");

以及以下配置:

Map defaultConf = Utils.readStormConfig();

Map conf = new HashMap();
conf.put(Config.TOPOLOGY_WORKERS, 1);
conf.put(Config.NIMBUS_HOST, "IP to my remote cluster");
conf.put(Config.NIMBUS_THRIFT_PORT, defaultConf.get(Config.NIMBUS_THRIFT_PORT));
conf.put(Config.STORM_THRIFT_TRANSPORT_PLUGIN, defaultConf.get(Config.STORM_THRIFT_TRANSPORT_PLUGIN));

在本地集群上运行此拓扑(没有nimbus配置)时,一切正常。

LocalCluster cluster = new LocalCluster();
cluster.submitTopology("mytopology", conf, builder.createTopology());
Utils.sleep(10000);
cluster.shutdown();

但是,当通过调用

StormSubmitter.submitTopology("mytopology", conf, builder.createTopology());

我得到以下例外:

java.lang.RuntimeException: Must submit topologies using the 'storm' client script so that StormSubmitter knows which jar to upload.

所以,这个异常向我表明,storm提交者需要某种jar。在做了一些研究之后,我发现为了以编程方式提交jar,我必须在代码中设置以下属性。

System.setProperty("storm.jar", "path/to/jar");

下面是我的问题:
我要做的jar的目的是什么?它只是一个包含所有可用螺栓和喷嘴的库,但我仍然可以在代码中动态更改它们的顺序,还是部署的jar必须真正包含固定的拓扑?如果我要 Package 一个jar,这个jar是不是放进 System.setProperty ?
ps:我在maven项目中使用intellij。

70gysomp

70gysomp1#

如果向远程集群提交拓扑,则集群中的所有节点都必须可以使用所有使用的喷口/螺栓的代码(即类文件)。这就是提交给集群的jar文件的用途。它必须包含所有这些文件。在内部,storm的nimbus将把这个jar分发给所有工作节点,使代码对它们可用。
jar只需要包含您想要使用的类集(在您的例子中) TestWordSpout , TestWordCounter ,和 TestGlobalCount --如果你使用其他库的话,可能这三个库中使用的依赖类。请注意,嵌套jar不受支持,即jar中包含的jar不起作用——为此,需要先提取内部jar的类,然后将这些类直接添加到最终jar中)。
拓扑结构完全独立于jar文件。是的,这是您通过system属性指定的jar。为什么很多人建造一个包含 main 与拓扑定义(通常是静态的,但实际上也可能是灵活的)一起,它们不是像您那样通过ide提交拓扑,而是通过命令行提交拓扑 bin/storm . 为此,需要一个包含在jar中的入口点类,它有一个组装拓扑结构的main方法,同样的jar也用于类文件的代码分发,因为这样做非常方便(与提供单个入口点类和一个额外的jar文件不同)。

相关问题