为warc bolt设置新流失败

时间:2017-06-15 22:26:44

标签: web-crawler stormcrawler

我试图设置一个新的流来将Tika螺栓连接到一个warc螺栓。

import com.digitalpebble.stormcrawler.tika.ParserBolt;
import com.digitalpebble.stormcrawler.warc.WARCHdfsBolt;

builder.setBolt("tika", new ParserBolt(), numWorkers)
  .localOrShuffleGrouping("shunt","tika");

WARCHdfsBolt warcbolt = getWarcBolt("XX");

builder.setBolt("warc", warcbolt, numWorkers)
  .localOrShuffleGrouping("tika",  "warc");

在Tika定义中,我修改了outputDeclarerFields函数,如下所示,以定义我的新" warc"流:

@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
  declarer.declare(new Fields("url", "content", "metadata", "text"));
  declarer.declareStream(StatusStreamName, new Fields("url", "metadata", "status"));
  declarer.declareStream("warc",   new Fields("url", "content", "metadata", "text"));
}

但是,当我以本地模式启动拓扑时,我得到:

  

14308 [main] WARN o.a.s.d.s.Slot - SLOT debian8:1027   state EMPTY - 赋值null 14308 [main] WARN o.a.s.d.s.Slot - SLOT   debian8:1028从状态EMPTY开始 - 赋值null 14308 [main]   警告o.a.s.d.s.Slot - SLOT debian8:1029从州EMPTY开始 -   赋值null 14309 [main] INFO o.a.s.l.AsyncLocalizer - 清理   未使用的拓扑结构   / tmp / a1e3b7f5-e251-40ae-a032-b0839ca103c8 / supervisor / stormdist 14318   [主要] INFO o.a.s.d.s.Supervisor - 以id开始主管   主机debian8上的f42c64cd-7c36-40ab-9f85-4b7751ed2d6a。 15030 [主要]   警告o.a.s.d.nimbus - 拓扑提交例外。 (拓扑   name =' xxCrawler')#error {:cause nil:via [{:type   org.apache.storm.generated.InvalidTopologyException:message nil
  :at [org.apache.storm.daemon.common $ validate_structure_BANG_ invoke   common.clj 185]}]:trace   [[org.apache.storm.daemon.common $ validate_structure_BANG_ invoke   common.clj 185]
  [org.apache.storm.daemon.common $ system_topology_BANG_调用   common.clj 378]
  [org.apache.storm.daemon.nimbus $ mk_reified_nimbus $ reify__10782   submitTopologyWithOpts nimbus.clj 1694]
  [org.apache.storm.daemon.nimbus $ mk_reified_nimbus $ reify__10782   submitTopology nimbus.clj 1726]
  [sun.reflect.NativeMethodAccessorImpl invoke0   NativeMethodAccessorImpl.java -2]
  [sun.reflect.NativeMethodAccessorImpl调用   NativeMethodAccessorImpl.java 62]
  [sun.reflect.DelegatingMethodAccessorImpl调用   DelegatingMethodAccessorImpl.java 43] [java.lang.reflect.Method   调用Method.java 498] [clojure.lang.Reflector invokeMatchingMethod   Reflector.java 93] [clojure.lang.Reflector invokeInstanceMethod   Reflector.java 28] [org.apache.storm.testing $ submit_local_topology   调用testing.clj 310]
  [org.apache.storm.LocalCluster $ _submitTopology调用LocalCluster.clj   [] [org.apache.storm.LocalCluster submitTopology nil -1]
  [com.digitalpebble.stormcrawler.ConfigurableTopology提交   ConfigurableTopology.java 76]
  [com.digitalpebble.stormcrawler.ConfigurableTopology提交   ConfigurableTopology.java 65] [xx.xx.xx.xx.xxTopology运行   xxTopology.java 111]
  [com.digitalpebble.stormcrawler.ConfigurableTopology start   ConfigurableTopology.java 50] [xx.xx.xx.xx.xxTopology main   xxTopology.java 53]]} 15035 [main] ERROR   o.a.s.s.o.a.z.s.NIOServerCnxnFactory - Thread Thread [main,5,main]去世   org.apache.storm.generated.InvalidTopologyException:null           在org.apache.storm.daemon.common $ validate_structure_BANG_.invoke(common.clj:185)   〜[风暴芯1.1.0.jar:1.1.0]           在org.apache.storm.daemon.common $ system_topology_BANG_.invoke(common.clj:378)   〜[风暴芯1.1.0.jar:1.1.0]           在org.apache.storm.daemon.nimbus $ mk_reified_nimbus $ reify__10782.submitTopologyWithOpts(nimbus.clj:1694)   〜[风暴芯1.1.0.jar:1.1.0]           在org.apache.storm.daemon.nimbus $ mk_reified_nimbus $ reify__10782.submitTopology(nimbus.clj:1726)   〜[风暴芯1.1.0.jar:1.1.0]           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)〜[?:1.8.0_131]           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)   〜[:?1.8.0_131]           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)   〜[:?1.8.0_131]           在java.lang.reflect.Method.invoke(Method.java:498)〜[?:1.8.0_131]           在clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)   〜[Clojure的-1.7.0.jar:?]           在clojure.lang.Reflector.invokeInstanceMethod(Reflector.java:28)   〜[Clojure的-1.7.0.jar:?]           在org.apache.storm.testing $ submit_local_topology.invoke(testing.clj:310)   〜[风暴芯1.1.0.jar:1.1.0]           在org.apache.storm.LocalCluster $ _submitTopology.invoke(LocalCluster.clj:49)   〜[风暴芯1.1.0.jar:1.1.0]           在org.apache.storm.LocalCluster.submitTopology(未知来源)〜[storm-core-1.1.0.jar:1.1.0]           在com.digitalpebble.stormcrawler.ConfigurableTopology.submit(ConfigurableTopology.java:76)   〜[XX-履带1.1.jar:?]           在com.digitalpebble.stormcrawler.ConfigurableTopology.submit(ConfigurableTopology.java:65)   〜[XX-1.1.jar:?]           在xx.xx.xx.xx.xxTopology.run(xxTopology.java:111)〜[xx-crawler-1.1.jar:?]           在com.digitalpebble.stormcrawler.ConfigurableTopology.start(ConfigurableTopology.java:50)   〜[XX-履带1.1.jar:?]           在xx.xx.xx.xx.xxTopology.main(xxTopology.java:53)〜[xx-crawler-1.1.jar:?]

任何帮助都将受到高度赞赏!!

请注意,如果我使用StatusStreamName(" status")流来连接tika和warc螺栓,它可以正常工作。

谢谢,

艾蒂安

1 个答案:

答案 0 :(得分:0)

WARC是从未经解析的原始内容生成的。您应该将WARC连接到Fetcher的输出而不是Parser bolt。

您不需要为warc声明一个新流,只需将warc螺栓连接到Tika螺栓出来的默认流即可。

我在你的代码中看到了

  

import com.digitalpebble.stormcrawler.tika.ParserBolt;

表示您依赖于默认实现(不生成'warc'流)。您是否忘记用修改后的实现替换它?