【问题标题】:Unable to run a storm-starter topology from the Storm tutorial无法从 Storm 教程中运行 Storm-starter 拓扑
【发布时间】:2016-02-19 14:41:59
【问题描述】:

当遵循storm-starter repo 中的指南时,我无法实际运行任何拓扑——比如ExclamationTopology

mvn clean install -DskipTests=true 运行成功,从顶级 Storm 存储库执行,mvn packagestorm-examples 级别执行。

当我尝试运行 storm jar target/storm-starter-2.0.0-SNAPSHOT.jar org.apache.storm.starter.ExclamationTopology 时,我收到错误:

Error: A JNI error has occurred, please check your installation and try  again
Exception in thread "main" java.lang.NoClassDefFoundError:   org/apache/storm/topology/IRichSpout

我正在运行 OS X,Java 版本:

java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

Maven 版本 3.3.9。

是否有人对我为什么会收到此错误以及我应该在设置中进行哪些更改有任何想法?

完整的错误输出:

Running:     

  /Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home/bin/java -client -Ddaemon.name= -Dstorm.options= -Dstorm.home=/Users/zachary/apache-storm-0.10.0 -Dstorm.log.dir=/Users/zachary/apache-storm-0.10.0/logs -Djava.library.path=/usr/local/lib:/opt/local/lib:/usr/lib -Dstorm.conf.file= -cp /Users/zachary/apache-storm-0.10.0/lib/asm-4.0.jar:/Users/zachary/apache-storm-0.10.0/lib/clojure-1.6.0.jar:/Users/zachary/apache-storm-0.10.0/lib/disruptor-2.10.4.jar:/Users/zachary/apache-storm-0.10.0/lib/hadoop-auth-2.4.0.jar:/Users/zachary/apache-storm-0.10.0/lib/kryo-2.21.jar:/Users/zachary/apache-storm-0.10.0/lib/log4j-api-2.1.jar:/Users/zachary/apache-storm-0.10.0/lib/log4j-core-2.1.jar:/Users/zachary/apache-storm-0.10.0/lib/log4j-over-slf4j-1.6.6.jar:/Users/zachary/apache-storm-0.10.0/lib/log4j-slf4j-impl-2.1.jar:/Users/zachary/apache-storm-0.10.0/lib/minlog-1.2.jar:/Users/zachary/apache-storm-0.10.0/lib/reflectasm-1.07-shaded.jar:/Users/zachary/apache-storm-0.10.0/lib/servlet-api-2.5.jar:/Users/zachary/apache-storm-0.10.0/lib/slf4j-api-1.7.7.jar:/Users/zachary/apache-storm-0.10.0/lib/storm-core-0.10.0.jar:target/storm-starter-2.0.0-SNAPSHOT.jar:/Users/zachary/apache-storm-0.10.0/conf:/Users/zachary/apache-storm-0.10.0/bin -Dstorm.jar=target/storm-starter-2.0.0-SNAPSHOT.jar org.apache.storm.starter.ExclamationTopology
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/storm/topology/IRichSpout
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: org.apache.storm.topology.IRichSpout
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

编辑:

按照以下答案中的建议从pom.xml 中删除scope 行后,此错误消失了,但替换为:

Exception in thread "main" java.lang.ExceptionInInitializerError

Caused by: java.lang.RuntimeException: java.io.IOException: Found multiple defaults.yaml resources. You're probably bundling the Storm jars with your topology jar. [jar:file:/Users/zachary/apache-storm-0.10.0/lib/storm-core-0.10.0.jar!/defaults.yaml, jar:file:/Users/zachary/storm/examples/storm-starter/target/storm-starter-2.0.0-SNAPSHOT.jar!/defaults.yaml]

最终编辑

对于任何未来的 googler,我最终都没有通过 LocalCluster 的命令行运行 storm-starterexamples。我改为使用 Maven 建立一个新项目,添加 storm-core 作为依赖项,遵循 [this] (https://github.com/mbonaci/mbo-storm/wiki/Storm-setup-in-Eclipse-with-Maven,-Git-and-GitHub) 通用指南。然后,在 Eclipse 中,我能够从storm 导入正确的包来执行示例,例如ExclamationTopology。我使用相同的导入重写了该类(更改为import backtype.storm.Config 等)。然后,按原样运行文件即可。

这个quick Maven 指南也很有帮助。

【问题讨论】:

    标签: java apache-storm


    【解决方案1】:

    关于尼克的回答更准确一点。

    storm-starter/pom.xml 中,依赖项storm-core 指定范围为“已提供”:

    <dependency>
      <groupId>org.apache.storm</groupId>
      <artifactId>storm-core</artifactId>
      <version>${project.version}</version>
      <!--
        Use "provided" scope to keep storm out of the jar-with-dependencies
        For IntelliJ dev, intellij will load properly.
      -->
      <scope>${provided.scope}</scope>
    </dependency>
    

    如果您使用LocalCluster 在本地运行,则需要将storm-core 作为默认范围“编译”的依赖项包含在内,即只需删除scope 标记,然后在storm-starter 中再次运行mvn -DskipTests package

    【讨论】:

    • 感谢您的评论。在此更改之后,我原来的错误确实消失了,并被Caused by: java.lang.RuntimeException: java.io.IOException: Found multiple defaults.yaml resources. You're probably bundling the Storm jars with your topology jar. 取代。我已经根据原帖进行了修改。我看到你回答了同样的错误here。但是,我只使用裸 storm-starter 存储库,没有任何更改或自定义螺栓/喷嘴,所以我不确定我为什么会遇到这个问题。
    • 好吧,storm-started 从来都不是为您想要的使用方式而设计的;)因此,您需要对其进行调整以使其适用于此。顺便说一句:如果你想在 IDE 中运行代码,它应该比在命令行上使用 maven 运行它更简单。如果你使用LocalCluster,你基本上可以像任何其他常规Java程序一样运行包含main的类。
    • 嗯,我明白了。所以我应该在 Eclipse 中加载storm-starter,还是在 Eclipse 中创建一个通用的新 Storm 项目?你知道我必须对storm-starter 进行哪些其他更改才能使其从命令行在LocalCluster 中运行?
    • 我建议开始一个全新的(maven?)项目。对于命令行上的storm-starter,我认为default.yaml 问题应该是要解决的最后一个问题以使其正常工作(只需编辑 pom.xml 以排除 jar 程序集的 default.yaml ——即使我想知道这首先是一个问题——这个问题应该只存在于提交到真正的集群而不是 LocalCluster ......)
    • 非常感谢您的帮助。我将尝试更改为default.yaml,看看我是否至少可以让它工作。我的意思是,我不需要做任何其他事情来指定我想要一个LocalCluster,对吧?因为我没有说要选择本地或专门启动它。
    【解决方案2】:

    关于 Storm 的 NoClassDefFoundError,通常是指来自 pom.xml 中 &lt;scope&gt; 标记的错误。

    如果您尝试在安装了 Storm 的机器集群上运行项目,则应“提供”&lt;scope&gt; (&lt;scope&gt;provide&lt;/scope&gt;),否则如果您尝试在本地执行拓扑,则范围必须设置为“编译”。

    希望这会有所帮助。

    【讨论】:

    • 感谢您的帮助!此更改解决了此错误,但导致了另一个错误。
    • 不客气。如果您想在本地运行拓扑,您应该打开代码并通过 IDE 运行它,确保您的代码使用 LocalCluster。查看代码还可以让您更好地了解幕后发生的事情。
    • 我的计划只是按照storm-starter repo 中的指南至少让它工作,然后切换到 Eclipse 以实际查看代码并进行更改。你知道在 IDE 中使用 LocalCluster 运行 Storm 项目的指南吗?
    • ExclamationTopology.java(你说你正在尝试运行)有一个 main 方法。在 main 方法结束时,有一个 if 语句检查调用该 main 方法时使用了多少参数。如果没有参数(当你通过没有参数的 Eclipse 运行它时是真的),那么它会使用 LocalCluster 提交,否则它会尝试使用 StormSubmitter 将它提交到实际的集群。
    【解决方案3】:

    我第一次尝试运行storm-starter时,被缺少的pom或一些依赖项阻塞了。

    我又读了一遍文件。然后我发现我应该先从项目的根目录而不是storm-starter目录安装storm。

    提供的范围应该没问题。 IDE 将尝试从本地存储库中找到它

    【讨论】:

      【解决方案4】:

      我也遇到了同样的问题(最初是 NoClassDefFoundError,后来是多个 defaults.yaml)

      对我来说,intellij 中的配置更改解决了这个问题。

      运行 ---> 编辑配置 ---> 勾选 - 包含具有“已提供”范围的依赖项。

      所以基本上当您在集群模式下运行时,storm-core 的范围应该在 pom.xml 中“提供”。以上配置将确保在运行时从集群提供依赖项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-24
        • 1970-01-01
        相关资源
        最近更新 更多