如何在Intellij中从storm-starter运行WordCountTopology

问题描述 投票:6回答:2

我已经和Storm一起工作了一段时间,但是想要开始开发。正如所建议的那样,我使用IntelliJ(到目前为止,我使用的是Eclipse,并且只针对Java API编写拓扑)。

我也在看https://github.com/apache/storm/tree/master/examples/storm-starter#intellij-idea

此文档不完整。我首先无法在Intellij中运行任何东西。我可以理解,我需要删除storm-core依赖的范围(在storm-starter pom.xml中)。 (在这里找到:storm-starter with intellij idea,maven project could not find class

之后我就能够建立这个项目。我也可以在IntelliJ中运行ExclamationTopology而没有任何问题。但是,WordCountTopology失败了。

首先我得到以下错误:

java.lang.RuntimeException:backtype.storm.multilang.NoOutputException:管道到子进程似乎被破坏了!没有输出读取。序列化程序异常:回溯(最近一次调用最后一次):导入风暴中的文件“splitsentence.py”,第16行ImportError:没有名为storm的模块

更新:不需要安装python-storm才能使其正常工作

我能够通过以下方式解决它:apt-get install python-storm(来自StackOverflow)

但是,我不会说Python,并且想知道问题是什么以及为什么我可以像这样解决它。只是想深入了解它。也许有人可以解释。

不幸的是,我现在收到一个不同的错误:

java.lang.RuntimeException:backtype.storm.multilang.NoOutputException:管道到子进程似乎被破坏了!没有输出读取。 Serializer Exception:Traceback(最近一次调用last):文件“splitsentence.py”,第18行,在SplitSentenceBolt类(storm.BasicBolt)中:AttributeError:'module'对象没有属性'BasicBolt'

我没有在互联网上找到任何解决方案。问问[email protected]也没有帮助。我提出以下建议:

我认为总是假设拓扑总是通过storm-command行调用。因此工作目录将是$ {STORM-INSTALLATION} / bin / storm由于storm.py位于此目录中,因此splitSentence.py将能够找到风暴模块。您是否可以将工作目录设置为存在storm.py的路径,然后尝试。如果有效,我们可以稍后将其添加到文档中

但是,查找工作目录并没有解决问题。

由于我不熟悉Python,而且我是IntelliJ的新手,我现在被困住了。因为ExclamationTopology运行,我想我的基本设置是正确的。

我做错了什么?有可能在IntelliJ中的WordcountTopology中运行LocalCluster吗?

python intellij-idea apache-storm
2个回答
6
投票

不幸的是,AFAIK无法在没有打包文件的情况下使用LocalCluster运行multilang功能。

ShellProcess依赖于TopologyContext的codeDir,由主管使用。 worker被序列化为stormcode.ser,但是multilang文件应该被提取到序列化文件之外,以便python / ruby​​ / node / etc可以加载它。

使用分发模式完成此操作很容易,因为总是有用户提交的jar,并且主管可以知道它是用户提交的内容。

但是使用本地模式实现这一点并不容易,因为主管无法知道用户提交的jar,用户可以在不打包的情况下将拓扑运行到本地模式。

因此,本地模式的Supervisor在类路径中从每个jar(以“jar”结尾)查找资源目录(“resources”),并将第一次出现复制到codeDir。

storm jar将用户拓扑jar放在classpath的第一个,因此它可以毫无问题地运行。

通常情况下,ShellProcess很自然找不到“splitsentence.py”。也许你的工作目录或PYTHONPATH做了这个伎俩。


1
投票

我遇到了类似的问题,不是使用示例拓扑,而是使用Python bolt。

还体验到“AttributeError:'module'对象没有属性'BasicBolt'”异常 - 在本地模式下以及提交到集群时。

关于此的资源非常少,我找到了你的问题而没有其他人讨论这个问题。

如果其他人有同样的问题:确保在您的pom文件中包含正确的Maven“multilang-python”依赖项。这会将正确的运行时依赖项打包到运行拓扑所需的JAR文件中。

© www.soinside.com 2019 - 2024. All rights reserved.