Java 使用附加类路径运行Storm时出现问题

Java 使用附加类路径运行Storm时出现问题,java,apache-storm,Java,Apache Storm,如何使用其他类路径运行storm拓扑? 我的输出目录如下: myapp.jar(清单的类路径包含config&lib目录) 库-(目录) conf-(目录) 针对这个问题有以下解决方案(对我来说不太好-我认为这不是最佳做法): 将这些文件打包到jar中 把那些文件放在暴风库里 参考:没有(干净的)方法(我知道)来扩展storm workers的类路径。除了拓扑jar本身之外,类路径是在JVM启动=>时定义的,存在的任何东西对每个节点上运行的所有拓扑都是可见的(因此是共享的)。此外,由于storm

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

我的输出目录如下:

  • myapp.jar(清单的类路径包含config&lib目录)
  • 库-(目录)
  • conf-(目录)
  • 针对这个问题有以下解决方案(对我来说不太好-我认为这不是最佳做法):

  • 将这些文件打包到jar中
  • 把那些文件放在暴风库里
  • 参考:

    没有(干净的)方法(我知道)来扩展storm workers的类路径。除了拓扑jar本身之外,类路径是在JVM启动=>时定义的,存在的任何东西对每个节点上运行的所有拓扑都是可见的(因此是共享的)。此外,由于storm的集群特性,将特定于拓扑的文件放在storm worker的文件系统上会使部署变得有点棘手,因为您必须将这些特定于拓扑的文件复制/更新到每个节点。风暴部署者是为了对我们隐瞒这一点

    到目前为止,将依赖jar捆绑到myapp.jar中对我来说效果很好,因为它确保了我的依赖关系始终在每个节点中部署和更新。从技术上讲,将配置文件绑定到myapp.jar也可以,但这会导致myapp.jar环境特定,这并不是最佳做法


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

    好的,我有一个解决方案。我不确定它是否足够好(因为它有点复杂),但无论如何…
    (如果您有其他解决方案,欢迎:-)

    步骤:

  • 例如,使用CMDB(配置管理数据库)
  • 使用(CMDB)在所需位置设置配置和/或依赖项
  • 动态加载这些资源(在代码中)并将它们添加到类路径中。资源位置将通过JVM参数获取

  • 脚本
    ${STORM\u HOME}/bin/STORM.py
    ,在运行
    STORM
    命令后被调用,它拾取环境变量
    STORM\u EXT\u CLASSPATH
    并将其添加到类路径

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

    export STORM_EXT_CLASSPATH={myoutput_dir}/lib
    

    跟进:这不起作用,因为
    storm.py
    中的
    storm\u EXT\u类路径
    没有正确添加-添加
    storm\u EXT\u类路径
    中的每个字符而不是整个字符串(即使使用方括号、引号等)

    使用
    storm jar
    命令提交拓扑时,storm将查看~/.storm目录,并将该目录中的任何文件添加到类路径中。这是我曾经使用过的方法,不必将依赖的jar打包到我提交给Storm的主jar中

    另见

    从:

    jar语法:风暴jar拓扑jar路径类

    使用指定的参数运行类的主方法。风暴 ~/.storm中的jar和config放在类路径上。过程是 配置为StormSubmitter将在 提交拓扑时的拓扑jar路径


    希望这有帮助

    我也是storm框架的新手,也面临着同样的问题。我正在使用storm apache-storm-0.9.2-Cubating版本,并在windows机器上进行测试。我有几个外部JAR,我想添加到storm类路径中,而不把它们放在${storm_HOME}/lib或${storm_HOME}/conf目录下。为了实现这一点,我修改了${STORM_HOME}/bin/STORM config.cmd文件,并在下面添加了新变量,该变量将指向外部jar位置(在我的例子中是C:\STORM installation\topology\custom jars)

    设置STORM\u BIN\u DIR=%STORM\u HOME%\BIN 设置STORM\u CUSTOM\u DIR=C:\STORM installation\topology\CUSTOM jars

    修改同一文件中的下一行,将所有外部JAR追加到类路径,如下所示

    设置类路径=!类路径!;%风暴之家%\lib* 设置类路径=%CLASSPATH%;%风暴\u自定义\u目录%*

    现在,如果您使用%storm\u HOME%\bin\storm classpath命令检查storm类路径,您的外部JAR应该显示在类路径中


    希望对您有所帮助。

    自2014年以来,storm似乎也发现了这个问题,现在有了解决方案(我使用的是版本
    1.1.1

    见文件:

    语法:风暴jar拓扑jar路径类

    使用指定的参数运行类的主方法。风暴
    ~/.storm
    中的JAR和配置放在类路径上。过程是 配置为StormSubmitter将在
    提交拓扑时拓扑jar路径

    当您想要运送应用程序中未包含的其他罐子时 jar,您可以使用逗号分隔的字符串将它们传递给
    --jars
    选项。 例如,
    --jars
    “您的本地jar.jar,您的-local-jar2.jar”
    将加载
    您的本地jar.jar
    您的-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”
    将加载
    绝地
    卡夫卡
    artifacta