如何从Intellij

时间:2015-08-13 10:36:55

标签: python intellij-idea apache-storm

我已经和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

3 个答案:

答案 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/