通过Nutch扩展点开发插件(添加自定义索引字段到solr)

爬虫系统:通过Nutch扩展点开发插件(添加自定义索引字段到solr)

准备工作

1. **爬虫环境** —— *nutch2.3.1 + solr4.10.3 + hbase0.98* 2. **开发环境** —— *Eclipse Mars.2 Release(4.5.2)* 3. **所需jar包** —— *apache-nutch-2.3.jar、hadoop-common-2.6.0.jar、slf4j-api-1.7.9.jar*

什么是Nutch扩展点

>       好的爬虫系统应该同时具备**高扩展性**(scalability)和**高伸缩性**(extensibility)的特点。Nutch爬虫系统不仅是采用动态加载插件形式设计(可扩展性),而且允许利用hadoop集群进行分布式爬取(可伸缩性)。用户可以根据自己的需求开发特定的爬虫系统,同时不需要过多担心业务量剧增会影响爬虫性能。 >       Nutch提供了扩展接口【 *Parser、ParseFilter等*】,用户通过实现这些接口进行插件开发。

本文插件的意义

>       利用nutch原始插件爬取web数据,然后把数据放入solr建索引,此时solr中的索引字段只有默认配置的几个,如果我们需要加入额外的字段,则需要利用Nutch的扩展接口进行索引插件开发。

如何利用Nutch扩展点开发插件

1、 确定实现哪个扩展点?       本文需要在solr中新增索引字段,所以需要利用索引阶段的扩展点【IndexWriter、IndexingFilter】,Nutch已经实现了indexer-solr插件用于创建solr索引,我们可以重新实现indexer-solr插件替换掉原来的;或者利用索引过滤往索引对象【NutchDocument】中加入需要进行索引的字段。本文使用IndexingFilter。 2、 如何开发插件?       2.1 eclipse新建java项目;       2.2 实现IndexingFilter接口;
	public class ExtraIndexer implements IndexingFilter {
		private static final Logger LOGGER = LoggerFactory.getLogger(ExtraIndexer.class);
		private Configuration conf;
		private String CRAWLID_VALUE;
	
		/**
		 * NutchDocument为索引数据对象
		 * WebPage为爬虫持久层数据表
		 */
		public NutchDocument filter(NutchDocument doc, String url, WebPage page) throws IndexingException {
	
			// just in case
			if (doc == null)
				return doc;
			addCrawlId(doc, url, page);
			addFetchTime(doc, url, page);
			return doc;
		}
	
		private NutchDocument addFetchTime(NutchDocument doc, String url, WebPage page) {
			String fetchTime = page.getFetchTime().toString();
			LOGGER.info(">>>>>>>>>>add fetchtime: " + fetchTime);
			doc.add("fetchTime", fetchTime);
			return doc;
		}
	
		private NutchDocument addCrawlId(NutchDocument doc, String url, WebPage page) {
			doc.add("crawlId", this.CRAWLID_VALUE);
			LOGGER.info(">>>>>>>>>>add crawlId: " + this.CRAWLID_VALUE);
			return doc;
		}
	
		public void setConf(Configuration conf) {
			this.conf = conf;
			this.CRAWLID_VALUE = conf.get(Nutch.CRAWL_ID_KEY);
			LOGGER.info(">>>>>>>>>>crawlID for indexing set to: " + this.CRAWLID_VALUE);
		}
	
		public Configuration getConf() {
			return this.conf;
		}
	
		@Override
		public Collection<Field> getFields() {
			return null;
		}
	}

      2.3 编写配置文件;

plugin.xml:插件信息提供给Nutch识别.

<plugin
   id="index-extra"
   name="Extra Indexing Filter"
   version="1.0.0"
   provider-name="nutch.org">

   <runtime>
      <library name="index-extra.jar">
         <export name="*"/>
      </library>
   </runtime>
   <requires>
      <import plugin="nutch-extensionpoints"/>
   </requires>
   <extension id="org.apache.nutch.indexer.extra"
              name="Nutch Extra Indexing Filter"
              point="org.apache.nutch.indexer.IndexingFilter">
      <implementation id="ExtraIndexer"
                      class="org.apache.nutch.indexer.extra.ExtraIndexer"/>
   </extension>

</plugin>

build.xml:给ant提供编译信息

<project name="index-extra" default="jar-core">
  <import file="../build-plugin.xml"/>
</project>

ivy.xml:描述插件的相关依赖,给ivy提供信息方便管理这些依赖

<ivy-module version="1.0">
  <info organisation="org.apache.nutch" module="${ant.project.name}">
    <license name="Apache 2.0"/>
    <ivyauthor name="Apache Nutch Team" url="http://nutch.apache.org"/>
    <description>
        Apache Nutch
    </description>
  </info>

  <configurations>
    <include file="../../../ivy/ivy-configurations.xml"/>
  </configurations>

  <publications>
    <!--get the artifact from our module name-->
    <artifact conf="master"/>
  </publications>

  <dependencies>
  </dependencies>
  
</ivy-module>

      2.4 在nutch安装目录下编译插件;

a、把index-extra源码加入到{NUTCH-HOME}/src/plugin
b、修改{NUTCH-HOME}/src/plugin/build.xml文件
c、修改{NUTCH-HOME}/build.xml文件
d、编辑{NUTCH-HOME}/conf中的相关配置文件
e、在{NUTCH-HOME}目录下运行:ant runtime

3、 如何利用开发好的插件?

      3.1 修改nutch-site配置文件;

<property>
   <name>plugin.includes</name>
   <value>protocol-httpclient|urlfilter-regex|index-(extra|basic|anchor|more|metadata)|indexer-solr|summary-basic|scoring-opic|urlnormalizer-(pass|regex|basic)|parse-(html|tika|text|metatags)</value>
</property>

      3.2 修改schema.xml配置文件;

<field name="crawlId" type="string" stored="true" indexed="false"/>
<field name="fetchTime" type="string" stored="true" indexed="false"/>

      3.3 修改solrindex-mapping.xml【nutch和solr索引映射】配置文件;

<field dest="fetchTime" source="fetchTime"/>
<field dest="crawlId" source="crawlId"/>

      3.4 修改solr配置文件;

{NUTCH-HOME}/runtime/local/conf下的schema.xml复制到solr实例的conf目录下{SOLR-HOME}/collection1/conf/,并重启solr服务器

4、运行爬虫命令验证结果?

一站式命令:nohup bin/crawl urls/ craw-name http://××××:8080/solr/ 3
创建索引命令:nohup bin/nutch solrindex http://××××:8080/solr/ -all -crawlId craw-name &

小结

      本文抛砖引玉,主要实现了在nutch索引阶段,通过扩展插件的手段,添加自定义的索引字段到NutchDocument索引数据对象中,从而在随后solr的CRUD阶段【indexer-solr】把添加的字段提交到solr。 **注:**博主水平有限,望批评指正!以求共勉!
posted @ 2017-12-13 16:55  chaffee  阅读(705)  评论(0编辑  收藏  举报