使用其他类路径运行Storm的问题

时间:2014-03-01 18:07:39

标签: java apache-storm

如何使用其他类路径运行storm拓扑?

我的输出目录如下:

  1. myapp.jar(清单的类路径包含config& lib目录)
  2. lib - (目录)
  3. conf - (目录)
  4. 此问题有以下解决方案(对我不利 - 我不认为这是最佳做法):

    1. 将这些文件打包在jar中。
    2. 将这些文件放在风暴库中。
    3. 参考:https://groups.google.com/forum/#!topic/storm-user/YqNr82Y3Nac

6 个答案:

答案 0 :(得分:2)

没有(干净的)方式(我知道)扩展风暴工作者的类路径。除拓扑jar本身外,类路径在JVM start-up =>中定义。在那里存在的任何东西都可见(因此被所有拓扑在每个节点上运行)。此外,由于风暴的集群特性,在风暴工作者的文件系统上放置特定于拓扑的文件会使部署变得有点棘手,因为您必须将这些特定于拓扑的文件复制/更新到每个节点。 Storm Deployer旨在向我们隐藏它。

将依赖的jar捆绑到myapp.jar到目前为止对我来说效果很好,因为它确保我的依赖项始终在每个节点中进行部署和更新。捆绑配置文件在技术上也可以,但是这会使myapp.jar特定于环境,这确实不是最佳实践。

我通常在我部署的节点(不是运行拓扑的节点)中复制任何补充配置文件,以json友好格式将它们序列化,并在部署时将它们添加到Storm配置中。就像我可以在任何我的拓扑在集群的某个节点上启动时从任何prepare()方法再次读取它们。在这里,这种方法再次确保我的配置在我的集群的任何节点中都存在并且是最新的。

答案 1 :(得分:1)

运行${STORM_HOME}/bin/storm.py命令后调用的脚本storm将获取环境变量STORM_EXT_CLASSPATH并将其添加到类路径中。

设置该环境变量应解决您的问题:

export STORM_EXT_CLASSPATH={myoutput_dir}/lib

跟进:由于storm.py中的known bug STORM_EXT_CLASSPATH无法正确添加STORM_EXT_CLASSPATH,因此无法执行此操作添加{1}}而不是整个字符串(即使您使用方括号,引号等)

答案 2 :(得分:1)

似乎自2014年风暴以来也发现了这个问题并且现在有一个解决方案(我使用版本1.1.1)。

请参阅文档:http://storm.apache.org/releases/1.1.1/Command-line-client.html

  

语法:storm jar topology-jar-path class ...

     

使用指定的参数运行class的主要方法。风暴   ~/.storm中的jar和configs放在类路径中。这个过程是   配置,以便StormSubmitter将上传jar   提交拓扑时topology-jar-path

     

如果您要运送未包含在应用程序中的其他罐子   jar,你可以用逗号分隔的字符串将它们传递给--jars选项。   例如,--jars "your-local-jar.jar,your-local-jar2.jar"   将加载your-local-jar.jaryour-local-jar2.jar。当你   想要发送maven工件及其传递依赖关系,你可以   用逗号分隔的字符串将它们传递给--artifacts。你也可以   排除某些依赖关系,例如你在maven pom中所做的事情。请   使用' ^'添加排除工件神器后分隔的字符串。   例如,--artifacts "redis.clients:jedis:2.9.0,org.apache.kafka:kafka_2.10:0.8.2.2^org.slf4j:slf4j-log4j12"将加载jediskafka工件以及所有传递依赖项,但不包括slf4j-log4j12中的kafka

答案 3 :(得分:0)

<强> O.K。所以我有一个解决方案。我不确定它是否足够好(因为它有点复杂)但无论如何......
(如果您有其他解决方案,欢迎他们:-))

步骤:

  1. 使用CMDB(配置管理数据库)作为示例puppet。
  2. 使用(CMDB)在所需位置设置配置和/或依赖项。
  3. 动态加载此资源(在您的代码中)并将它们添加到您的类路径中。资源位置将通过JVM参数获取。

答案 4 :(得分:0)

使用storm jar命令提交拓扑时,Storm会查看〜/ .storm目录并将该目录中的所有文件添加到类路径中。这是我过去不必将我的依赖罐装入我提交给Storm的主要罐子的方法。

另见my answer here

来自documentation

  

jar语法:storm jar topology-jar-path class ...

     

使用指定的参数运行class的main方法。风暴   〜/ .storm中的jar和configs放在类路径中。这个过程是   配置,以便StormSubmitter将上传jar   提交拓扑时的topology-jar-path。

希望这有帮助!

答案 5 :(得分:0)

我也是风暴框架的新手,面临同样的问题。我正在使用风暴apache-storm-0.9.2-incubating版本并在Windows机器上测试它。我想要在storm classpath中添加几个外部jar,而不将它们放在$ {STORM_HOME} / lib或$ {STORM_HOME} / conf目录下。为了达到这个目的,我修改了 $ {STORM_HOME} /bin/storm-config.cmd 文件,并添加了新的变量,该变量将指向外部jar位置(在我的情况下,它是C:\ storm-安装\拓扑\定制罐子)

设置STORM_BIN_DIR =%STORM_HOME%\ bin 设置STORM_CUSTOM_DIR = C:\ storm-installation \ topology \ custom-jars

修改同一文件中的下一行,将所有外部jar附加到classpath,如下所示。

设置CLASSPATH =!CLASSPATH !;%STORM_HOME%\ lib * 设置CLASSPATH =%CLASSPATH%;%STORM_CUSTOM_DIR%*

现在,如果使用%STORM_HOME%\ bin \ storm classpath 命令检查风暴类路径,则外部jar应显示在类路径中。

希望对你有所帮助。