我正在使用pyleus --verbose local xyz_topology.jar
运行风暴拓扑“storm-1.0.0, pyleus-0.3.0, centos-6.6
”并获取错误
线程“main”中的异常java.lang.NoClassDefFoundError: backtype /风暴/拓扑/ IRichBolt
Running: java -client -Ddaemon.name= -Dstorm.options= -Dstorm.home=/usr/local/apache-storm-1.0.0
-Dstorm.log.dir=/usr/local/apache-storm-1.0.0/logs -Djava.library.path=/usr/local/
lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /usr/local/apache-storm-1.0.0/lib/asm-5.0.3.jar:
/usr/local/apache-storm-1.0.0/lib/clojure-1.7.0.jar:/usr/local/apache-storm-1.0.0/lib/disruptor-3.3.2.jar:
/usr/local/apache-storm-1.0.0/lib/kryo-3.0.3.jar:
/usr/local/apache-storm-1.0.0/lib/log4j-api-2.1.jar:/usr/local/apache-storm-1.0.0/lib/log4j-core-2.1.jar
:/usr/local/apache-storm-1.0.0/lib/log4j-over-slf4j-1.6.6.jar:
/usr/local/apache-storm-1.0.0/lib/log4j-slf4j-impl-2.1.jar:/usr/local/apache-storm-1.0.0/lib/minlog-1.3.0.jar:
/usr/local/apache-storm-1.0.0/lib/objenesis-2.1.jar:/usr/local/apache-storm-1.0.0/lib/reflectasm-1.10.1.jar:
/usr/local/apache-storm-1.0.0/lib/servlet-api-2.5.jar:/usr/local/apache-storm-1.0.0/lib/slf4j-api-1.7.7.jar:
/usr/local/apache-storm-1.0.0/lib/storm-core-1.0.0.jar:
/usr/local/apache-storm-1.0.0/lib/storm-rename-hack-1.0.0.jar:xyzTopology.jar:
/usr/local/storm/conf:/usr/local/apache-storm-1.0.0/bin
-Dstorm.jar=xyz_topology.jar com.yelp.pyleus.PyleusTopologyBuilder --local
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: backtype/storm/topology/IRichBolt
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)
at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: backtype.storm.topology.IRichBolt
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 7 more
pyleus local: error: [StormError] Storm command failed. Run with --verbose for more info.
使用旧版storm-0.10.0 and pyleus-0.3.0
时,相同的拓扑结构运行良好且没有任何错误。
我查看了风暴-0.10.0和风暴1.0.0文档,发现风暴-1.0.0
(a)包结构已更改
(b)没有提供IRichBolt类,而是有两个新类--BaseStatefulBoltExecutor和BasicBoltExecutor - 它们实现了IRichBolt接口。
似乎新的storm-1.0.0
版本无法与旧pyleus-0.3.0
版本的storm-0.10.0
一起使用。
解决问题并允许在storm-1.0.0
和pyleus-0.3.0
上运行拓扑的最佳解决方案是什么?
答案 0 :(得分:1)
Storm 1.0.0包含有关包名称的重大重构。所有包backtype/*
都被org/apache/storm
取代。因此,您需要使用Storm 1.0.0重新编译拓扑(包括一些代码更改;即,使用不同的import
来对齐新的包结构。)
作为替代方案,您可以在Storm群集中启用向后兼容性(请参阅https://storm.apache.org/releases/1.0.0/index.html)
NOTE
在最新版本中,类包已更改为" backtype.storm" to" org.apache.storm"所以使用旧版本编译的拓扑代码不会像在那样在Storm 1.0.0上运行。通过以下配置可以实现向后兼容性
client.jartransformer.class:" org.apache.storm.hack.StormShadeTransformer"
如果要运行使用旧版本storm编译的代码,则需要在风暴安装中添加上述配置。配置应添加到用于提交拓扑的机器中。