Nutch1.7学习笔记5:Fetcher源代码分析

来源:互联网 发布:linux如何ping端口号 编辑:程序博客网 时间:2024/04/29 04:42

Nutch1.7学习笔记5:Fetcher源代码分析

作者:雨水,时间:2013-11-15 博客地址:http://blog.csdn.net/gobitan

Fetcher分析

Fetcher是以生产者/消费者模式来处理网页抓取的。

QueueFeeder作为生产者,从前面Generator中产生的<url, CrawlDatum>读取出来,然后加入到FetchItemQueues队列中,加入的时候需处理队列已满等异常情况。

 FetcherThread作为消费者,不断从队列里取出待抓取的URL进行抓取。

Fetcher与Injector和Generator的不同之处在于,后面两者均包含一个Mapper,而前者实现的是MapRunnable接口。

Fetch类总体结构:

  1. 六个内部静态类:

(1)   InputFormat:继承自 org.apache.hadoop.mapred.SequenceFileInputFormat,重载了getSplits方法。

(2)   FetchItem:定义了一个抓取项.

(3)   FetchItemQueue:抓取的队列。

(4)   FetchItemQueues:队列集合,其中的元素在QueueFeeder的循环中加入。加入的时候会按照QueueID进行队列区分,QueueID的组成为” proto + "://" + key.toLowerCase()”。引入队列集合的原因是为了控制单 个队列同时最多只有一个线程去抓取,这样可以避免多个线程同时抓取同一个网站从而给该站点造成负担。

依次取出一个队列,如果队列为空,则从集合中将该队列remove;

如果当前运行中的个数大于最大线程数或者还未到一下次的抓取时间,则返回空。否则,删除一个,并在运行集合中加入一个。

(5)   QueueFeeder:生产者,向待抓取队列中加入FetchItem。其基本流程如下:

判断当前的时间是否超过设定的时间限制,如果已经超过了,则只把剩余需要抓取的全部读取出来,仅仅为了统计计数,就不加入待抓取队列了。时间限制是由fetcher.timelimit.mins控制的,可以在nutch-default.xml中找到,默认值为-1,它表示不设定抓取时间限制,所有的都抓取直到抓取完为止。

如果没有超过时间限制,那么判断当前队列是否已经满了,队列的大小为抓取线程数fetcher.threads.fetch与fetcher.queue.depth.multiplier的乘积。如果已经满了,就休息1秒继续循环判断直到队列有空位。

如果队列有空位了,然后读取需要抓取的<url,CrawlDatum>放入队列中,直到队列放满或者没有url了。

(6)   FetcherThread:从待抓取队列中取出item,然后进行抓取。

 

  1. 两个Run方法,一个实现MapRunnable接口,一个实现Tool接口。
fetch方法:该方面里主要是一些参数的初始化和job相关的类及输入输出路径设置,具体的逻辑都在设置的类中。
原创粉丝点击