InjectorJob架构及流程

一、InjectorJob类结构分析

InjectorJob架构及流程_第1张图片

由图可见,Injector类实现了接口Tool,继承自NutchTool类,有一个继承自Mapper的内部类UrlMapper。

二 InjectorJob类的运行流程

InjectorJob架构及流程_第2张图片

三 InjectorJob类运行流程详解
1、 main函数:提供函数入口,创建一个ToolRunner类,先加载Nutch的两个配置文件nutch-default.xml和nutch-site.xml文件,接收命令行输入参数并创建一个InjectorJob类。接下来程序跳转到run(String[] args)函数。

2、run(String[] args)函数:接收命令行输入的参数,判断从命令行当中接收的参数是否合理,如果没有输入参数或者输入参数不合理,则提示正确的输入方法;如果输入参数正确,则跳转到inject函数。

3、 inject(Path urlDir)函数:通过参数args[0]创建path实例,表示种子文件的目录。该函数打印了inject开始的一些基本信息之后跳转到run(ToolUtil.toArgMap(Nutch.ARG_SEEDDIR, urlDir))函数,执行InjectorJob类的和核心部分

4、 run(ToolUtil.toArgMap(Nutch.ARG_SEEDDIR, urlDir)):该函数调用了hadoop的map/reduce的架构,首先根据现有的配置文件等创建一个Job类currentJob来处理各种操作,包括设置输出的存储格式,执行map和reduce的相应的类等等,其中在执行currentJob.waitForCompletion(true)时调用了UrlMapper内部类,调用之后,将注入成功和被滤掉的站点个数记录到日志文件当中,返回处理之后的结果。

5、 UrlMapper内部类:该类实现对网页的一些基本信息的控制,包括url标准化urlNormalizers,fetch的时间间隔,网页的注入分数,网页过滤filters,分数赋值scfilters,当前时间等。包含两个方法,setup和map。

6、 setup(Context context)函数:相当于UrlMapper内部类的构造函数,通过传入的参数context为该类中的各个参数赋值。

7、 map(LongWritable key,Text value,Context context)函数:该函数主要有以下几个功能:
 获取value当中的url,以一行为一个url,若其长度为0或者以“#”开头,则直接返回;
 将url中的metaname和metavalue值以Map的形式存储在matadata当中,metaname包括两种形式即nutchScoreMDName和nutchFetchIntervalMDName;
 标准化和过滤url,并给这些新注入的url赋予一定的初始分数,在赋予初始分数的过程当中,调用了org.apache.nutch.scoring包中的ScoringFilters类,这个类为了注入分数又调用了ScoringFilter接口,最后又根据用户想要使用那种方式去注入分数调用opic或tld等插件。如果想更改分数注入方式,则可以通过修改conf文件夹下面的nutch-default.xml文件中的plugin.includes的value值来实现;
 记录注入网页本次fetch的时间和其正常的两次fetch之间的时间间隔。

在UrlMapper类的map函数中,传入的参数有一个键值对,key和对应的value,还有一个Context context参数,符合Haddoop的map/reduce工作模式,map函数实现完上述功能之后,将注入的网页数目和处理之后的url回写到context当中。

8、 返回到各调用函数当中,最终返回到主函数,程序退出。

四 种子站点的输入
种子站点每一行的输入形式:
例:
http://www.nutch.org/ \t nutch.score=10 \t nutch.fetchInterval=2592000 \t userType=open_source
其中第一个元素是必须有的,后面的元素是可选的。nutch.score表示的注入站点的初始score,若文件当中没有输入这个值,则默认为1。

五 Nutch流程中各个主要Job的共同点

  1. 各个Job都采用map/reduce的模式进行工作,在工作过程当中,都将生成的结果和一些基本信息都回写到Context类的一个实例context当中;若要用到相应的信息,也是从context当中取出,如InjectorJob中内部类UrlMapper的setup函数就是在context当中取出了相应的配置信息赋给其数据成员。

  2. 在执行返回值 为Map的run函数时,在确定了数据库的存储形式(gora.hbase.store.HBaseStore)之后,程序都会加载本程序所需要的插件。例如在InjectorJob的运行当中,如果在plugin.includes当中添加了opic和tld等插件,那么就会在开始先加载以备后来的使用。

你可能感兴趣的:(java,搜索引擎)