如何从 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/
我已经使用 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/