Web crawler 为warc bolt设置新流失败

Web crawler 为warc bolt设置新流失败,web-crawler,stormcrawler,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"); WARCHdfsB

我正在尝试设置一个新的流,将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”流:

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

14308[主]警告o.a.s.d.s.插槽-插槽debian8:1027从中开始 状态为空-分配null 14308[主]警告o.a.s.d.s.插槽-插槽 debian8:1028以空状态启动-赋值为空14308[main] 警告o.a.s.d.s.插槽-插槽debian8:1029以空状态启动- 分配null 14309[main]信息o.a.s.l.AsyncLocalizer-清理 在中查找未使用的拓扑 /tmp/a1e3b7f5-e251-40ae-a032-b0839ca103c8/主管/风暴区14318 [main]信息o.a.s.d.s.主管-具有id的启动主管 主机debian8上的f42c64cd-7c36-40ab-9f85-4b7751ed2d6a。15030[主要] 警告o.a.s.d.nimbus-拓扑提交异常。(拓扑学) name='xxCrawler')#错误{:cause nil:via[{:type org.apache.storm.generated.InvalidTopologyException:消息nil
:位于[org.apache.storm.daemon.common$validate\u structure\u BANG\u invoke common.clj 185]}]:跟踪 [[org.apache.storm.daemon.common$validate\u structure\u BANG\uinvoke] common.clj 185]
[org.apache.storm.daemon.common$system\u拓扑结构\u BANG\u调用 common.clj 378]
[org.apache.storm.daemon.nimbus$mk\u-reified\u-nimbus$reify\u 10782 submittopology选择nimbus.clj 1694]
[org.apache.storm.daemon.nimbus$mk\u-reified\u-nimbus$reify\u 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 invoke Method.java 498][clojure.lang.Reflector invokeMatchingMethod Reflector.java 93][clojure.lang.Reflector invokeInstanceMethod Reflector.java 28][org.apache.storm.testing$submit\u local\u拓扑 调用testing.clj 310]
[org.apache.storm.LocalCluster$\u submitTopology invoke LocalCluster.clj 49][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.xx拓扑运行 xxTopology.java 111]
[com.digitalpebble.stormcrawler.ConfigurableTopology开始 ConfigurableTopology.java 50][xx.xx.xx.xx.xxTopology main xxTopology.java 53]}15035[main]错误 o、 a.s.s.o.a.z.s.NIOServerCNXNFFactory-线程[main,5,main]已死亡 org.apache.storm.generated.InvalidTopologyException:null 在org.apache.storm.daemon.common$validate\u structure\u BANG\u.invoke(common.clj:185) ~[storm-core-1.1.0.jar:1.1.0] 位于org.apache.storm.daemon.common$system\u topology\u BANG\u.invoke(common.clj:378) ~[storm-core-1.1.0.jar:1.1.0] 在org.apache.storm.daemon.nimbus$mk_-reified_-nimbus$reify__10782.submitTopologyWithOpts(nimbus.clj:1694) ~[storm-core-1.1.0.jar:1.1.0] 在org.apache.storm.daemon.nimbus$mk_-reified_-nimbus$reify_-10782.submitTopology(nimbus.clj:1726) ~[storm-core-1.1.0.jar:1.1.0] 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[?:1.8.0_131] 位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131] 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中 ~[?:1.8.0_131] 在java.lang.reflect.Method.invoke(Method.java:498)~[?:1.8.0131] 位于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\u local\u topology.invoke(testing.clj:310) ~[storm-core-1.1.0.jar:1.1.0] 位于org.apache.storm.LocalCluster$\u submitTopology.invoke(LocalCluster.clj:49) ~[storm-core-1.1.0.jar:1.1.0] 在org.apache.storm.LocalCluster.submitTopology(未知源)~[storm-core-1.1.0.jar:1.1.0] 在com.digitalpebble.stormclawler.ConfigurableTopology.submit(ConfigurableTopology.java:76)上 ~[xx-crawler-1.1.jar:?] 在com.digitalpebble.stormcrawler.ConfigurableTopology.submit(ConfigurableTopology.java:65)上 ~[xx-1.1.jar:?] 运行(xxTopology.java:111)~[xx-crawler-1.1.jar:?] 在com.digitalpebble.stormcrawler.ConfigurableTopology.start(ConfigurableTopology.java:50)上 ~[xx-crawler-1.1.jar:?] 在xx.xx.xx.xx.xxTopology.main(xxTopology.java:53)~[xx-crawler-1.1.jar:?]

任何帮助都将不胜感激

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

谢谢,


Etienne

WARC是从原始的、未解析的内容生成的。您应该将WARC连接到获取程序的输出,而不是解析器

您不需要仅为warc声明新流,只需将warc螺栓连接到Tika螺栓产生的默认流即可

我在你的密码里看到了

导入com.digitalpebble.stormclawler.tika.ParserBolt


这表明您依赖于默认实现(不生成“warc”流)。您是否忘了将其替换为您修改过的实现?

亲爱的Julien,非常感谢您的宝贵意见。我想要的是只将选定的网页归档到WARC文件。选择基于位于解析器中的正则表达式。然后,如果有匹配项,则归档页面内容(使用“warc”流)。因此,解析器和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"));
}