Apache Storm:以编程方式将拓扑提交到远程集群而不创建jar

时间:2015-11-29 12:22:08

标签: java apache-storm

这是我第一次使用Apache Storm,我遇到了以下问题。对于我的应用程序,我要求每个使用我的应用程序的用户的拓扑图不同,每个用户也可以有多个拓扑图。

因此,我有了使用拓扑构建器动态创建拓扑图的想法。例如,使用来自storm的toplogy示例,这只是:

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();

但是,只需调用

即可将toplogy提交到远程群集
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 Submitter需要某种jar。在做了一些研究之后,我发现我必须在我的代码中设置以下属性才能以编程方式提交jar。

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

所以这是我的问题:

我必须承诺的罐子的目的是什么?它只是一个包含我所有可用螺栓和喷口的库,但我仍然可以在代码中动态更改它们的顺序,或者部署的jar是否真的包含固定拓扑?如果我必须打包一个罐子就是这个罐子进入System.setProperty

PS:我正在使用IntelliJ和Maven项目。

1 个答案:

答案 0 :(得分:4)

如果您向远程群集提交拓扑,则所有使用的spouts / bolt的代码(即类文件)必须可供群集中的所有节点使用。这是提交给集群的jar文件的目的。它必须包含所有这些文件。在内部,Storm的Nimbus会将这个jar分发给所有工作节点,以便为他们提供代码。

jar只需要包含您要使用的类集(在您的情况下为TestWordSpoutTestWordCounterTestGlobalCount - 并且可能包含在这些类中使用的依赖类三,如果你使用其他一些库。请注意不支持嵌套的jar,即jar中包含的jar不起作用 - 为此,你需要首先提取内部jar的类并添加这些直接进入最后的jar)。

拓扑的结构是完全独立于jar文件的。是的,这是您通过系统属性指定的jar。许多人构建包含main和拓扑定义(通常是静态但实际上也可以是灵活的)的jar的原因是他们不像你那样通过IDE提交拓扑,而是通过命令行bin/storm。为了实现这一点,需要一个包含在jar中的入口点类,它具有组装拓扑结构的main方法,并且同样的jar也用于类文件的代码分发,因为这非常方便(与提供单入口点类和一个额外的jar文件)。