我已经和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:管道到子进程似乎被破坏了!没有输出读取。 序列化程序异常: Traceback(最近一次调用最后一次): 文件“splitsentence.py”,第16行,in 进口风暴 ImportError:没有名为storm的模块
更新:不需要安装python-storm
才能使其正常工作
我能够通过以下方式解决它:apt-get install python-storm(来自StackOverflow)
但是,我不会说Python,并且想知道问题是什么以及为什么我可以像这样解决它。只是想深入了解它。也许有人可以解释。
不幸的是,我现在遇到了另一个错误:
java.lang.RuntimeException:backtype.storm.multilang.NoOutputException:管道到子进程似乎被破坏了!没有输出读取。 序列化程序异常: Traceback(最近一次调用最后一次): 文件“splitsentence.py”,第18行,in class SplitSentenceBolt(storm.BasicBolt): AttributeError:'module'对象没有属性'BasicBolt'
我在互联网上找不到任何解决方案。在dev@storm.apache.org
询问也没有帮助。我提出以下建议:
我认为总是假设拓扑总是通过storm-command行调用。因此工作目录将是$ {STORM-INSTALLATION} / bin / storm由于storm.py位于此目录中,因此splitSentence.py将能够找到风暴模块。您是否可以将工作目录设置为存在storm.py的路径,然后尝试。如果有效,我们可以稍后将其添加到文档
但是,查看工作目录并没有解决问题。
由于我不熟悉Python,而且我是IntelliJ的新手,我现在被困住了。因为ExclamationTopology
运行,我想我的基本设置是正确的。
我做错了什么?完全可以在IntelliJ中的WordcountTopology
中运行LocalCluster
答案 0 :(得分: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 :(得分:1)
我遇到了类似的问题,不是使用示例拓扑,而是使用Python螺栓。
还经历过"属性错误:'模块'对象没有属性' BasicBolt'"异常 - 在本地模式下以及提交到群集时。
这方面的资源非常少,我找到了你的问题而没有其他人讨论这个问题。
如果其他人遇到同样的问题: 确保包含正确的Maven" multilang-python"您的pom文件中的依赖项。这会将正确的运行时依赖项打包到运行拓扑所需的JAR文件中。
答案 2 :(得分:0)
我设法在我的virtualbox(暴风雨版本1.2.2)上运行它:
只需下载https://github.com/apache/storm/blob/master/storm-multilang/python/src/main/resources/resources/storm.py并将其放入您想要的任何文件夹中,例如:/apache-storm-1.2.2/examples/storm-starter/multilang/resources/,然后更改主要功能:< / p>
public static void main(String[] args) throws Exception {
SplitSentence pythonSplit = new SplitSentence();
Map env = new HashMap();
env.put("PYTHONPATH", "/apache-storm-1.2.2/examples/storm-starter/multilang/resources/");
pythonSplit.setEnv(env);
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new RandomSentenceSpout(), 5);
builder.setBolt("split",pythonSplit, 8).shuffleGrouping("spout");
builder.setBolt("count", new WordCount(), 12).fieldsGrouping("split", new Fields("word"));
Config conf = new Config();
conf.setDebug(true);
if (args != null && args.length > 0) {
conf.setNumWorkers(3);
StormSubmitter.submitTopologyWithProgressBar(args[0], conf, builder.createTopology());
}
else {
conf.setMaxTaskParallelism(3);
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("word-count", conf, builder.createTopology());
Thread.sleep(600000);
cluster.shutdown();
}
}
完整说明可在我的博客上找到,其中包括在本地模式和本地群集模式下运行时遇到的其他问题:https://lyhistory.com/storm/