Java 使用壳螺栓构建风暴拓扑
我目前正在尝试实现一个与R语言集成的Storm拓扑 作为起点,我采用了以下项目(),该项目通过扩展ShellBolt类来实现R集成,并使用R库来处理java和R端之间的通信 我的问题是,如果我创建一个基于常规(仅限java)螺栓的拓扑,我可以将它们链接在一起而不会出现问题。然而,当链条中间的一个螺栓是R型外壳螺栓时,该材料只是与分开。Java 使用壳螺栓构建风暴拓扑,java,r,apache-storm,Java,R,Apache Storm,我目前正在尝试实现一个与R语言集成的Storm拓扑 作为起点,我采用了以下项目(),该项目通过扩展ShellBolt类来实现R集成,并使用R库来处理java和R端之间的通信 我的问题是,如果我创建一个基于常规(仅限java)螺栓的拓扑,我可以将它们链接在一起而不会出现问题。然而,当链条中间的一个螺栓是R型外壳螺栓时,该材料只是与分开。 5661 [Thread-18] ERROR backtype.storm.util - Async loop died! java.lang.RuntimeEx
5661 [Thread-18] ERROR backtype.storm.util - Async loop died!
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: Pipe to subprocess seems to be broken! No output read.
Shell Process Exception:
at backtype.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:87) ~[storm-0.9.0-wip16.jar:na]
at backtype.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:58) ~[storm-0.9.0-wip16.jar:na]
at backtype.storm.disruptor$consume_batch_when_available.invoke(disruptor.clj:62) ~[storm-0.9.0-wip16.jar:na]
at backtype.storm.daemon.executor$fn__3557$fn__3569$fn__3616.invoke(executor.clj:715) ~[storm-0.9.0-wip16.jar:na]
at backtype.storm.util$async_loop$fn__436.invoke(util.clj:377) ~[storm-0.9.0-wip16.jar:na]
at clojure.lang.AFn.run(AFn.java:24) ~[clojure-1.4.0.jar:na]
at java.lang.Thread.run(Unknown Source) ~[na:1.7.0_25]
Caused by: java.lang.RuntimeException: java.lang.RuntimeException: Pipe to subprocess seems to be broken! No output read.
更具体地说,以下拓扑按预期工作:
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new RandomSentenceSpout(), 1);
builder.setBolt("permutebolt", new PermuteBolt(), 1).shuffleGrouping("spout");
其中,PermuteBolt是一个R型壳体螺栓。本例的日志显示了预期的输出:
6246 [Thread-18] INFO backtype.storm.daemon.task - Emitting: spout default [four score and seven years ago]
6246 [Thread-16] INFO backtype.storm.daemon.executor - Processing received message source: spout:3, stream: default, id: {}, [four score and seven years ago]
6261 [Thread-23] INFO backtype.storm.daemon.task - Emitting: permutebolt default ["PERMUTE seven years ago and four score"]
但是,如果我添加了另一个从第一个螺栓获取数据的螺栓,例如:
builder.setBolt("permutebolt", new PermuteBolt(), 1).shuffleGrouping("spout");
builder.setBolt("identity", new IdentityBolt(new Fields("identity")), 1).fieldsGrouping("permutebolt", new Fields("permutation"));
它失败,上面打印了跟踪。另外,奇怪的是,第二个失败的例子包含在项目中
这是以前有人遇到过的问题吗
更新:我注意到只有在使用R Shell螺栓时才会出现这种情况,此后我尝试启动使用python脚本的螺栓,并且能够正常链接它们。@andrei,这在今天上传到github的1.01中得到了修复: 它已提交给CRAN,并将很快提供 谢谢你的报道
-Allen您能给我们看一下PermuteBolt和IdentityBolt代码吗?从技术上讲,这不是我的代码,正如我提到的,这个示例是随项目提供的。身份螺栓内置在Storm中,据我所知,它只会发出它订阅的任何内容(因此得名),而PermuteBolt运行一个R脚本,并在它和Storm之间调解数据这是PermuteBolt和