java—使用额外的类路径运行storm时出现的问题

gtlvzcf8  于 2021-06-24  发布在  Storm
关注(0)|答案(6)|浏览(371)

如何使用其他类路径运行storm拓扑?
我的输出目录如下:
myapp.jar(清单的类路径包含config&lib目录)
库-(目录)
conf-(目录)
对于这个问题,有以下几种解决方案(对我来说不太好-我认为这不是最佳做法):
将这些文件打包到jar中。
把那些文件放在暴风库里。
裁判:https://groups.google.com/forum/#!主题/风暴用户/yqnr82y3nac

eagi6jfj

eagi6jfj1#

o、 所以我有个解决办法。我不确定它是否足够好(因为它有点复杂),但不管怎样。。。
(如果您有其他解决方案,欢迎:-)
步骤:
例如,使用cmdb(配置管理数据库)。
使用(cmdb)在所需位置设置配置和/或依赖项。
动态加载这些资源(在代码中)并将它们添加到类路径中。资源位置将通过jvm参数获取。

puruo6ea

puruo6ea2#

剧本 ${STORM_HOME}/bin/storm.py ,在运行 storm 命令,选择环境变量 STORM_EXT_CLASSPATH 并将其添加到类路径。
设置该环境变量可以解决您的问题:

export STORM_EXT_CLASSPATH={myoutput_dir}/lib

跟进:这不起作用,因为一个已知的错误 storm.py 哪里 STORM_EXT_CLASSPATH 未正确添加-中的每个单独字符 STORM_EXT_CLASSPATH 添加而不是整个字符串(即使使用方括号、引号等)

dm7nw8vv

dm7nw8vv3#

我也是新的风暴框架,并面临着同样的问题。我正在使用storm apache-storm-0.9.2-incuberating版本并在windows机器上测试它。我有几个外部jar,我想添加到storm类路径中,而不把它们放在${storm\u home}/lib或${storm\u home}/conf目录下。为了实现这一点,我修改了${storm\u home}/bin/storm-config.cmd文件,并在下面添加了指向外部jar位置的新变量(在我的例子中是c:\storm installation\topology\custom jars)
set storm\u bin\u dir=%storm\u home%\bin set storm\u custom\u dir=c:\storm installation\topology\custom jars
修改同一文件中的下一行,将所有外部jar附加到类路径,如下所示。
设置classpath=!类路径!;%storm_home%\lib设置类路径=%classpath%;%风暴\u自定义\u目录%
现在,如果您使用%storm\u home%\bin\storm classpath命令检查storm类路径,您的外部jar应该显示在类路径中。
希望对你有帮助。

zz2j4svz

zz2j4svz4#

没有(干净的)方法(我知道)来扩展storm workers的类路径。除了拓扑jar本身之外,类路径是在jvm启动时定义的=>存在的任何东西都是对每个节点上运行的所有拓扑可见的(因此是共享的)。此外,由于storm的集群特性,将特定于拓扑的文件放在storm worker的文件系统上会使部署变得更加困难,因为您必须将这些特定于拓扑的文件复制/更新到每个节点。风暴部署者是为了对我们隐瞒这一点。
到目前为止,将依赖jar绑定到myapp.jar对我来说效果很好,因为它可以确保在每个节点中始终部署和更新依赖关系。从技术上讲,将配置文件绑定到myapp.jar也是可行的,但这会导致myapp.jar环境特定,这确实不是最佳做法。
我通常复制部署节点(而不是运行拓扑的节点)中的任何补充配置文件,以json友好格式序列化它们,并在部署时将它们添加到storm配置中。这样,每当我的拓扑在集群的某个节点上启动时,我就可以从任何prepare()方法再次读取它们。在这里,这种方法再次确保我的配置在集群的任何节点中都是最新的。

rta7y2nd

rta7y2nd5#

自2014年以来,storm似乎也发现了这个问题,现在有了解决方案(我使用的是 1.1.1 ).
见文件:http://storm.apache.org/releases/1.1.1/command-line-client.html
语法:storm jar拓扑jar路径类。。。
运行主方法 class 使用指定的参数。Storm来袭了 ~/.storm 放在类路径上。该过程被配置为stormsubmitter将在 topology-jar-path 提交拓扑时。
当您想运送其他未包含在应用程序jar中的jar时,您可以将它们传递给 --jars 带有逗号分隔字符串的选项。例如, --jars "your-local-jar.jar,your-local-jar2.jar" 将加载 your-local-jar.jar 以及 your-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" 将加载 jedis 以及 kafka 工件和所有可传递依赖项,但不包括 slf4j-log4j12kafka .

eqqqjvef

eqqqjvef6#

使用提交拓扑时 storm jar 命令时,storm将查找~/.storm目录并将该目录中的任何文件添加到类路径。这是我使用的方法,不必将依赖的jar打包到我提交给storm的主jar中。
请看我的答案。
根据文件:
jar语法:storm jar拓扑jar路径类。。。
使用指定的参数运行类的主方法。~/.storm中的storm jar和configs放在类路径上。该过程被配置为在提交拓扑时,stormsubmitter将在拓扑jar路径上传jar。
希望这有帮助!

相关问题