0

我想在我的拓扑中包含 tika 解析器。我已jsoup.treat.non.html.as.error按照false配置中的设置进行设置,并且按照 Storm crawler 文档中的说明设置了 tika 拓扑。

爬取拓扑的设置如下:

builder.setSpout("spout", new MemorySpout(testURLs));

builder.setBolt("partitioner", new URLPartitionerBolt()).shuffleGrouping("spout");

builder.setBolt("fetch", new FetcherBolt()).fieldsGrouping("partitioner", new Fields("key"));

builder.setBolt("sitemap", new SiteMapParserBolt()).localOrShuffleGrouping("fetch");

builder.setBolt("jsoup", new JSoupParserBolt()).localOrShuffleGrouping("sitemap");

builder.setBolt("shunt", new RedirectionBolt()).localOrShuffleGrouping("jsoup");

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

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

builder.setBolt("status", new MemoryStatusUpdater()).localOrShuffleGrouping(Constants.StatusStreamName)
                    .localOrShuffleGrouping("sitemap", Constants.StatusStreamName)
                    .localOrShuffleGrouping("shunt", Constants.StatusStreamName)
                    .localOrShuffleGrouping("tika", Constants.StatusStreamName)
                    .localOrShuffleGrouping("indexer", Constants.StatusStreamName);

return submit("crawl", conf, builder);

使用此拓扑,我收到了 Invalid Topology 异常。该问题似乎是由状态螺栓引起的。因为,当我排除状态螺栓时,我的爬网拓扑工作没有任何问题。我应该如何配置状态螺栓?

4

1 回答 1

1

第一个连接缺少“fetch”,您应该连接“jsoup”而不是“shunt”,后者不会向状态流发出外链接:它只是将 JSoup 无法处理的元组发送到特定流以供 Tika 使用。有关一些背景信息,请参阅StatusStream wiki

下面的定义应该有效。

builder.setBolt("status", new MemoryStatusUpdater()).
    .localOrShuffleGrouping("fetch", Constants.StatusStreamName)
    .localOrShuffleGrouping("sitemap", Constants.StatusStreamName)
    .localOrShuffleGrouping("jsoup", Constants.StatusStreamName)
    .localOrShuffleGrouping("tika", Constants.StatusStreamName)
    .localOrShuffleGrouping("indexer", Constants.StatusStreamName);

这是假设您的 HBaseIndexer 扩展 AbstractIndexerBolt 并将元组发送到状态流。

请注意,MemoryStatusUpdater 主要用于测试和调试:如果您有多个工作人员,它不一定会工作,并且如果重新启动工作进程时拓扑将丢失其数据。

于 2017-02-21T09:11:40.110 回答