在storm-1.0.0和pyleus-0.3.0上运行拓扑时出现IRichBolt错误

时间:2016-05-15 19:19:25

标签: python apache-storm topology pyleus

我正在使用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.0pyleus-0.3.0 上运行拓扑的最佳解决方案是什么?

1 个答案:

答案 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编译的代码,则需要在风暴安装中添加上述配置。配置应添加到用于提交拓扑的机器中。

     

有关详细信息,请参阅https://issues.apache.org/jira/browse/STORM-1202