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

How to run WordCountTopology from storm-starter in Intellij

我已经使用 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

之后我就可以构建项目了。我也可以 运行 ExclamationTopology 在 IntelliJ 中没有问题。但是,WordCountTopology 失败了。

首先我得到以下错误:

java.lang.RuntimeException: backtype.storm.multilang.NoOutputException: Pipe to subprocess seems to be broken! No output read. Serializer Exception: Traceback (most recent call last): File "splitsentence.py", line 16, in import storm ImportError: No module named storm

更新:不需要安装 python-storm 即可运行

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

但是,我不会说 Python,想知道问题出在哪里,为什么我可以这样解决。只是想更深入地了解它。也许有人可以解释一下。

不幸的是,我现在遇到了不同的错误:

java.lang.RuntimeException: backtype.storm.multilang.NoOutputException: Pipe to subprocess seems to be broken! No output read. Serializer Exception: Traceback (most recent call last): File "splitsentence.py", line 18, in class SplitSentenceBolt(storm.BasicBolt): AttributeError: 'module' object has no attribute 'BasicBolt'

我在网上没有找到任何解决办法。在 dev@storm.apache.org 询问也无济于事。我去以下建议:

I think that it was always assumed that topology would always be invoked through storm-command line. Thus working directory would be ${STORM-INSTALLATION}/bin/storm Since storm.py is in the this directory, splitSentence.py would be able to find storm modules. Can you set the working directory to a path, where storm.py is present and then try. If it works, we can add it later to the documentation

但是,更改工作目录并没有解决问题。

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

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

不幸的是,据我所知,如果没有打包文件,您无法使用 LocalCluster 运行 多语言功能。

ShellProcess依赖TopologyContext的codeDir,supervisor使用。 Workers 被序列化为 stormcode.ser,但多语言文件应提取到序列化文件之外,以便 python/ruby/node/etc 可以加载它。

用分发模式实现这个很容易,因为总是有用户提交的 jar,主管可以知道这是用户提交的。

但是用本地模式完成这个并不容易,因为主管无法知道用户提交的 jar,用户可以 运行 拓扑到本地模式而无需打包。

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

storm jar 将用户拓扑 jar 放在类路径的第一个,因此可以 运行 没有问题。

所以正常情况下,ShellProcess找不到"splitsentence.py"是很正常的。也许您的工作目录或 PYTHONPATH 成功了。

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

也遇到了 "AttributeError: 'module' object has no attribute 'BasicBolt'" 异常 - 在本地模式和提交到集群时。

这方面的资源很少,我找到了你的问题,几乎没有其他人讨论过这个问题。

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

我设法 运行 在我的 virtualbox 上,storm 版本 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/,然后更改主函数:

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/