繁体   English   中英

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

[英]Apache Storm: Submit Topology programatically to remote cluster without creating jar

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

因此,我想到了使用拓扑生成器动态创建拓扑图的想法。 例如,使用来自storm的拓扑示例,结果将是:

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 Submitter需要某种jar。 经过研究,我发现我必须在代码中设置以下属性,以便以编程方式提交jar。

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

所以这是我的问题:

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

PS:我在Maven项目中使用IntelliJ。

如果将拓扑提交到远程集群,则所有已使用的喷口/螺栓的代码(即,类文件)必须对集群中的所有节点均可用。 这就是将jar文件提交给集群的目的。 它必须包含所有这些文件。 在内部,Storm的Nimbus会将这个jar分发给所有工作节点,以使代码可供他们使用。

jar只需包含要使用的类集(在您的情况下为TestWordSpoutTestWordCounterTestGlobalCount ),如果您使用其他库,则可能包含这三个类中的依赖类。请注意嵌套的jar不支持,即,罐子中包含的罐子不起作用-为此,您需要先提取内部罐子的类,然后将这些类直接添加到最终罐子中)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM