`
lmx800
  • 浏览: 29858 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

Nutch插件加载分析

阅读更多

当某个插件需要被加载时, Nutch 会加载所有插件的相关接口到缓存,此后每个插件需要实例的时候,根据相关接口和相关接口实现实例在缓存内的记录,使用反射实现一个实例并返回,下面以 QueryFilter 的所有插件被加载例子进行说明。

 
具体代码参看org.apache.nutch.seacher.QueryFilters<init>

( 1 )当第一次需要得到 QueryFilter 的一个子类的实例时,使用下面这句话试图获得所有的实例:
 
this.queryFilters =
(QueryFilter[]) conf.getObject(QueryFilter.class .getName());
 
2)如果为空,则试图从插件仓库中得到该插件的扩展点:
 
ExtensionPoint point = PluginRepository.get(conf)
            .getExtensionPoint(QueryFilter.X_POINT_ID);
 
PluginRepository.get(conf) 这句话中,返回插件仓库,如果仓库为空,会初始化所有插件:
 
初始化所有插件PluginRepository.<init>
     试图从缓存内获得插件仓库。
PluginRepository result = (PluginRepository)CACHE.get(conf);
     如果未获得,则初始化所有插件
result = new PluginRepository(conf);
l         初始化以活动插件和扩展点的集合
fActivatedPlugins = new HashMap();
      fExtensionPoints = new HashMap();
      this.conf = conf;
l         获得插件存放位置
      String[] pluginFolders = conf.getStrings("plugin.folders");
l         实例化PluginManifestParser:
  PluginManifestParser manifestParser = new PluginManifestParser(conf, this);
   PluginManifestParser 是一个封装了PluginRepository的工具类,在构造时,分析每个插件的文件夹,把每个plugin.xml文件的内容进行分析,记录了所有的插件接口和插件接口内所包含的所有实现类的关系。
l         放入缓存
   CACHE.put(conf, result);
 
Plugin.xml 描述内容见附录一
 
3)获得所有QueryFilter的子类描述。
Extension[] extensions = point.getExtensions();
 
4)循环获得每个插件的两个参数,fieldName和rawFieldNames,生成每个filter插件实例。
for (int i = 0; i < extensions.length; i++) {
          Extension extension = extensions[i];
          ArrayList fieldNames = parseFieldNames(extension, "fields");
          ArrayList rawFieldNames = parseFieldNames(extension, "raw-fields");
          if (fieldNames.size() == 0 && rawFieldNames.size() == 0) {
            if (LOG.isWarnEnabled()) {
              LOG.warn("QueryFilter: " + extension.getId()
                     + " names no fields.");
            }
            continue;
          }
          filters[i] = (QueryFilter) extension.getExtensionInstance();
          FIELD_NAMES.addAll(fieldNames);
          FIELD_NAMES.addAll(rawFieldNames);
          conf.setObject("FIELD_NAMES", FIELD_NAMES);
          RAW_FIELD_NAMES.addAll(rawFieldNames);
          conf.setObject("RAW_FIELD_NAMES", RAW_FIELD_NAMES);
        }
 

 
<?xml version="1.0" encoding="UTF-8"?>
 
<!— 插件的根元素,根元素的属性表明了一个插件的基本身份-->
<plugin id=” 唯一身份(被插件仓库作为身份标示)” name=”名称” version=”版本号”
provider=” 作者”class=”类名(可选)”>
 
<!-- 以下两个内容中引用的类库,都是作为本类使用反射时生成实例所需要的类库-->
<runtime>
    <library name=" 运行时的类库">
         <!— 如果存在此元素,则保存到fExportedLibs(输出类库集合),否则存放到
fNotExportedLibs (非输出类库集合)-->
         <export name="*"/>
    </library>
</runtime>
 
<requires>
    <!— 需要注意,此处所需要的类库,包括该类库所需的类库,都不得在此引用本插件-->
    <import plugin=" 所需类库"/>
</requires>
 
<extension id=" 本类的包名(从代码中看没有被使用)"
              name=" 类名(从代码中看没有被使用)"
              point=" 扩展点类名(即接口名)">
      <implementation id=" 实现扩展的唯一标识(与类名相同,被parse-plugins.xml
作为身份表示使用)"
           class=" 实现扩展的类的类名"/>
      <parameter name=" 参数名" value="参数值"/>
</extension>
 
<!— 仅在nutch-extensionpoints\plugin.xml中存在,一次性加载纪录下所有的扩展点的名称-->
< extension-point id=” 扩展点唯一标识”name=”扩展点名”/>
 
</plugin>
分享到:
评论

相关推荐

    Nutch插件机制

    ### Nutch插件机制详解 #### 一、引言 Nutch是一款开源的网络爬虫项目,能够自动抓取互联网上的网页并建立索引。为了提高系统的灵活性、可扩展性和可维护性,Nutch采用了插件化的设计思路,即通过一系列可插拔的...

    基于Nutch 的插件系统的原理分析

    本文旨在深入分析Nutch插件系统的原理,并探讨其如何实现良好的扩展性和灵活性。 #### 二、Nutch搜索引擎概述 ##### 2.1 Nutch简介 Nutch是一款基于Java语言编写的开源搜索引擎。最初由俄勒冈州立大学发起,2005...

    Nutch_的配置文件

    3. **Nutch插件的配置文件**:每个Nutch插件都可能有自己的配置文件,这些文件在插件被加载时自动读取。例如,过滤器(filter)插件通常有自己的配置,用于设定过滤规则。 配置文件的加载顺序决定了配置的优先级,...

    基于ApacheNutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件nutch-htmlunit.zip

    基于Apache Nutch 1.8和Htmlunit组件,实现对于AJAX加载类型页面的完整页面内容抓取解析。 According to the implementation of Apache Nutch 1.8, we can't get dynamic ...

    分布式搜索引擎nutch开发

    插件目录下的`src/plugin`是存放插件源代码的地方,编译后插件会被自动加载。 - **修改配置**:对于高级用户,可能需要调整Nutch的默认行为,例如改变分词规则、增加新的数据源或优化索引策略,这都需要修改配置...

    Nutch1.7二次开发培训讲义 之 腾讯微博抓取分析

    本篇培训讲义主要针对的是如何使用 Nutch 1.7 版本对腾讯微博进行抓取分析,特别强调了针对动态网页的抓取及自定义解析插件的方法。 #### 二、抓取目标与规则设置 ##### 1. 入口 URL 抓取的入口 URL 为:`...

    Nutch中文分词插件的编写与实现.pdf

    ### Nutch中文分词插件的编写与实现 #### 一、Nutch搜索引擎技术概览 随着互联网信息的爆炸性增长,搜索引擎成为了人们快速获取所需信息的重要工具。Nutch作为一个开源的搜索引擎框架,其核心优势在于灵活性和可...

    基于Apache Nutch和Htmlunit的扩展实现AJAX页面爬虫抓取解析插件.zip

    这个项目结合了Nutch和Htmlunit,创建了一个插件,使得Nutch能够处理那些通过AJAX加载的动态内容。步骤可能包括: 1. **集成Htmlunit**:将Htmlunit作为Nutch的插件引入,使Nutch具备JavaScript执行能力。 2. **...

    nutch入门学习

    - **什么是plugin**:Nutch支持插件机制,允许用户自定义爬虫、索引器和搜索模块的行为。 - **使用plugin的好处**:增强功能、提升灵活性、简化开发流程。 - **plugin工作原理**:通过扩展点和插件注册机制,实现...

    nutch-ajax:适用于AJAX的Apache Nutch插件页面获取,解析,索引

    Nutch AJAX page Fetch, Parse, Index Plugin项目简介基于Apache Nutch 2.3和Htmlunit, Selenium WebDriver等组件扩展,实现对于AJAX加载类型页面的完整页面内容抓取,以及特定数据项的解析和索引。According to the...

    基于Apache Nutch和Solr等组件扩展实现对于AJAX加载类型页面的完整页面内容抓取,以及特定数据项的解析和索引

    Nutch提供了一套插件系统,可以用于过滤和清洗抓取到的数据,去除广告、脚本等非正文信息,保留有价值的文本内容。清洗后的数据通常会存储在Hadoop HDFS(Hadoop分布式文件系统)中,以备后续处理。 最后,Apache ...

    Nutch 安装ppt

    Nutch 拥有一个高度模块化的设计,这使得开发者可以轻松地为其开发插件。 #### 二、Nutch 架构 Nutch 的架构主要分为以下几个部分: 1. **爬虫模块**:负责网页的抓取和解析。 2. **Hadoop 存储模块**:用于存储...

    IKAnalyzer源码

    3. **扩展机制**:IKAnalyzer支持插件化开发,用户可以通过实现`TokenFilter`接口来定制自己的分词规则。源码中的`TokenStream`类和`Token`类是实现这个机制的基础。 4. **词性标注**:源码中的`PosSegment`类实现...

    中文分词工具word-1.0,Java实现的中文分词组件多种基于词典的分词算法

    conf="C:/solr-4.7.0/example/solr/nutch/conf/word.local.conf"/&gt; 如不指定,使用默认配置文件,位于 word-1.0.jar 中的word.conf文件 ElasticSearch插件: 1、创建目录elasticsearch-1.1.0/plugins/word 2、将...

    Hadoop开发者第一期入门专刊

    Hive是基于Hadoop的数据仓库工具,可以帮助用户轻松地进行数据提取、转换和加载(ETL)。在Eclipse中调试Hive SQL查询可以让开发者更方便地定位和解决问题。主要步骤包括配置Eclipse的Hive插件、连接Hive服务、编写...

    xmg-gecco-demo-master.zip

    支持爬取规则的动态配置和加载 支持页面中的异步ajax请求 支持页面中的javascript变量抽取 利用Redis实现分布式抓取,参考gecco-redis 支持结合Spring开发业务逻辑,参考gecco-spring 支持htmlunit扩展,参考gecco-...

    201809网络爬虫系统-项目建设方案

    - **基础架构**:Nutch基于Lucene和Hadoop,利用Hadoop的分布式处理模型保证系统的高性能,同时通过插件机制实现了高度的可定制性。 ##### 2.2 数据架构 Nutch的抓取程序主要负责数据的抓取与索引构建,具体涉及...

    solr入门指南

    - Solr 提供了一系列工具和插件来构建自定义的搜索用户界面,使开发者能够轻松地集成 Solr 功能到自己的应用程序中。 #### 十、文本分析(Text Analysis) 1. **文本分析**: - Solr 的文本分析功能可以帮助处理...

Global site tag (gtag.js) - Google Analytics