Storm提交Topology運行方式分為本地和集群運行兩種,其中集群運行需要將程序打包並把jar包復制到集群,通過以下方式執行:
bin/storm jar /opt/run/storm-demo-1.0-SNAPSHOT-jar-with-dependencies.jar org.mort.storm.kafka.KafkaTopologyBasic
bin/storm jar [jar包路徑] [main所在類名]
不過有時程序運行報錯提示如下:
Caused by: java.lang.RuntimeException: java.io.IOException: Found multiple defaults.yaml resources. You're probably bundling the Storm jars with your topology jar. [jar:file:/opt/run/storm-demo-1.0-SNAPSHOT-jar-with-dependencies.jar!/defaults.yaml, jar:file:/opt/module/apache-storm-1.2.3/lib/storm-core-1.2.3.jar!/defaults.yaml] at org.apache.storm.utils.Utils.findAndReadConfigFile(Utils.java:385) at org.apache.storm.utils.Utils.readDefaultConfig(Utils.java:429) at org.apache.storm.utils.Utils.readStormConfig(Utils.java:465) at org.apache.storm.utils.Utils.<clinit>(Utils.java:179) ... 39 more Caused by: java.io.IOException: Found multiple defaults.yaml resources. You're probably bundling the Storm jars with your topology jar. [jar:file:/opt/run/storm-demo-1.0-SNAPSHOT-jar-with-dependencies.jar!/defaults.yaml, jar:file:/opt/module/apache-storm-1.2.3/lib/storm-core-1.2.3.jar!/defaults.yaml] at org.apache.storm.utils.Utils.getConfigFileInputStream(Utils.java:411) at org.apache.storm.utils.Utils.findAndReadConfigFile(Utils.java:364) ... 42 more
出現問題原因是storm-core下面也存在一個defaults.yaml文件,因此storm運行時報錯沖突,因此修改Maven配置文件,添加scope屬性並設為provided:
<dependency> <groupId>org.apache.storm</groupId> <artifactId>storm-core</artifactId> <version>1.2.3</version> <scope>provided</scope> </dependency>
scope設置成provided表示容器或JDK已提供范圍,表示該依賴包已經由目標容器(如tomcat)和JDK提供,只在編譯的classpath中加載和使用,打包的時候不會包含在目標包中。
再次運行成功提交。