Nutch-Crawler工作流程及文件格式详细分析_第1页
Nutch-Crawler工作流程及文件格式详细分析_第2页
Nutch-Crawler工作流程及文件格式详细分析_第3页
Nutch-Crawler工作流程及文件格式详细分析_第4页
Nutch-Crawler工作流程及文件格式详细分析_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NutchCrawler工作流程及文件格式详细分析Crawler和Searcher两部分被尽是分开,其要紧目的是为了使两个部分能够布地配置在硬件平台上,例如Crawler和Searcher分不被放置在两个主机上,如此能够极大的提升灵活性和性能。

一、总体介绍:

1、先注入种子urls到crawldb

2、循环:generate从crawldb中生成一个url的子集用于抓取fetch抓取上一小的url生成一个个segmentparse分析已抓取segment的内容update把已抓取的数据更新到原先的crawldb

3、从已抓取的segments中分析出link地图

4、索引segment文本及inlink锚文本

二、有关的数据结构:

CrawlDB

●CrawlDb是一个包含如下结构数据的文件:

<URL,CrawlDatum>

●CrawlDatum:

<status,date,interval,failures,linkCount,...>

●Status:

{db_unfetched,db_fetched,db_gone,linked,

fetch_success,fetch_fail,fetch_gone}

爬虫Crawler:

Crawler的工作流程包括了整个nutch的所有步骤--injector,generator,fetcher,parseSegment,updateCrawleDB,Invertlinks,Index,DeleteDuplicates,IndexMerger

Crawler涉及的数据文件和格式和含义,和以上的各个步骤有关的文件分不被存放在物理设备上的以下几个文件夹里,crawldb,segments,indexes,linkdb,index五个文件夹里。

那么各个步骤和流程是如何,各个文件夹里又是放着什么呢?

观看Crawler类能够明白它的流程

./nutchcrawlurls-dir~/crawl-depth4-threads10-topN2000

1、Injectorinjector=newInjector(conf);

Usage:Injector<crawldb><url_dir>

第一是建立起始url集,每个url都通过URLNormalizers、filter和scoreFilter三个过程并标记状态。第一通过normalizerplugin,把url进行标准化,例如basicnomalizer的作用有把大写的url标准化为小写,把空格去除等等。然后再通过的plugin是filter,能够按照你写的正则表达式把想要的url留下来。通过两个步骤后,然后确实是把那个url进行状态标记,每个url都对应着一个CrawlDatum,那个类对应着每个url在所有生命周期内的一切状态。细节上还有那个url处理的时刻和初始时的分值。

同时,在那个步骤里,会在文件系统里生成如下文件crawlDB\current\part-00000

那个文件夹里还有.data.crc,.index.crc,data,index四个文件

●MapReduce1:把输入的文件转换成DB格式

In:包含urls的文本文件

Map(line)→<url,CrawlDatum>;status=db_unfetched

Reduce()isidentity;

Output:临时的输出文件夹

●MapReduce2:合并到现有的DB

Input:第一步的输出和已存在的DB文件

Map()isidentity.

Reduce:合并CrawlDatum成一个实体(entry)

Out:一个新的DB

2、Generatorgenerator=newGenerator(conf);//Generatesasubsetofacrawldbtofetch

Usage:Generator<crawldb><segments_dir>[-force][-topNN][-numFetchersnumFetchers][-adddaysnumDays][-noFilter]

在那个步骤里,Generator一共做了四件情况,

1、给前面injector完成的输出结果里按分值选出前topN个url,作为一个fetch的子集。

2、按照第一步的结果检查是否差不多选取出一些url,CrawlDatum的实体集。

3、再次转化,此次要以url的host来分组,并以url的hash来排序。

4、按照以上的步骤的结果来更新crawldb(injector产生)。

●MapReduce1:按照要求选取一些要抓取的url

In:CrawlDB文件

Map()→ifdate≥now,invertto<CrawlDatum,url>

Partition以随机的hash值来分组

Reduce:

compare()以CrawlDatum.linkCount的降序排列

outputonlytop-Nmost-linkedentries

●MapReduce2:为下一步抓取预备

Map()isinvert;Partition()byhost,Reduce()isidentity.

Out:包含<url,CrawlDatum>要并行抓取的文件

3、Fetcherfetcher=newFetcher(conf);//Thefetcher.Mostoftheworkisdonebyplugins

Usage:Fetcher<segment>[-threadsn][-noParsing]

那个步骤里,Fetcher所做的情况要紧确实是抓取了,同时也完成一些其它的工作。第一,这是一个多线程的步骤,默认以10个线程去抓取。按照抓取回来后的结果状态来进行不同的标记,储备,再处理等等行为。输入是上一步骤Generator产生的segment文件夹,那个步骤里,考虑到先前差不多按照ip或host来patition了,因此在此就不再把input文件进行分割了。程序继承了SequenceFileInputFormat重写了inputFormat来达到这点。那个类的各种形为差不多上插件来具体完成的,它只是一个骨架一样为各种插件提供一个平台。它先按照url来取出具体的protocol,得到protocolOutput,进而得到状态status及内容content。然后,按照抓取的状态status来连续再处理。再处理时,第一会将这次抓取的内容content、状态status及它的状态标记进行储备。那个储备的过程中,还会记下抓取的时刻,再把segment存过metadata,同时在分析parsing前通过scoreFilter,再用parseUtil(一系列的parse插件)进行分析,分析后再经过一次score插件的处理。通过这一系列处理后,最后进行输出(url,fetcherOutput)。

之前讲到按照抓取回来的各种状态,进行再处理,这些状态一共包括12种,例如当抓取成功时,会像上刚讲的那样先储备结果,再判定是否是链接跳转,跳转的次数等等处理。

●MapReduce:抓取

In:<url,CrawlDatum>,以host分区,以hash值排序

Map(url,CrawlDatum)→<url,FetcherOutput>

多线程的,同步的map实现

调用已有的协议protocol插件

FetcherOutput:<CrawlDatum,Content>

Reduceisidentity

Out:两个文件:<url,CrawlDatum>,<url,Content>

4、ParseSegmentparseSegment=newParseSegment(conf);//Parsecontentinasegment

Usage:ParseSegmentsegment

关于那个步骤的逻辑比较简单,只是对抓取后上一步骤储备在segment里的content进行分析parse。同样,那个步骤的具体工作也是由插件来完成的。

MapReduce:分析内容

In:<url,Content>抓取来的内容

Map(url,Content)→<url,Parse>

调用分析插件parserplugins

Reduceisidentity.

Parse:<ParseText,ParseData>

Out:分割成三个文件:<url,ParseText>,<url,ParseData>和<url,CrawlDatum>为了outlinks.

5、CrawlDbcrawlDbTool=newCrawlDb(conf);//takestheoutputofthefetcherandupdatesthecrawldbaccordingly.

Usage:CrawlDb<crawldb>(-dir<segments>|<seg1><seg2>...)[-force][-normalize][-filter][-noAdditions]

那个类要紧是按照fetcher的输出去更新crawldb。map和reduce分不做了两方面的情况,在map里是对url的nomalizer,和filte,在reduce里是对新抓取进来的页面(CrawlDatum)和原先差不多存在的进行合并。

MapReduce:合并抓取的和分析后的输出到crawldb里

In:<url,CrawlDatum>现有的db加上抓取后的和分析后的输出

Map()isidentity

Reduce()合并所有实体(entry)成一个,以抓取后的状态覆盖原先的db状态信息,统计出分析后的链接数

Out:新的crawldb

6.LinkDblinkDbTool=newLinkDb(conf);//Maintainsaninvertedlinkmap,listingincominglinksforeachurl.

Usage:LinkDb<linkdb>(-dir<segmentsDir>|<seg1><seg2>...)[-force][-noNormalize][-noFilter]

那个类的作用是治理新转化进来的链接映射,并列出每个url的外部链接(incominglinks)。先是对每一个url取出它的outLinks,作map操作把那个url作为每个outLinks的incominglink,在reduce里把按照每个key来把一个url的所有incominglink都加到inlinks里。如此就把每个url的外部链接统计出来了。然后一步是对这些新加进来的链接进行合并。

●MapReduce:统计每个链接的外部链接

In:<url,ParseData>,包含所有链接的分析后的结果

Map(srcUrl,ParseData>→<destUrl,Inlinks>

为每个链出链接收集一个入链。

Inlinks:<srcUrl,anchorText>*

Reduce()加上外部入链数量

Out:<url,Inlinks>,一个有关完整的链接地图

7.Indexerindexer=newIndexer(conf);//Createindexesforsegments

Usage:<index><crawldb><linkdb><segment>...

那个类的任务是另一方面的工作了,它是基于hadoop和lucene的分布式索引。它确实是为前面爬虫抓取回来的数据进行索引好让用户能够搜索到这些数据。那个地点的输入就比较多了,有segments下的fetch_dir,parseData和parseText,还有crawldb下的current_dir和linkdb下的current_dir。在那个类里,map也不做,在reduce时处理。因此要把这些数据体组合成一个lucene的document让它索引了。在reduce里组装好后收集时是<url,doc>,最后在输出的OutputFormat类里进行真正的索引。

●MapReduce:生成lucene的索引文件

In:外个文件,values以<Class,Object>包装

<url,ParseData>fromparse,有title,metadata,等等信息.

<url,ParseText>fromparse,文本text

<url,Inlinks>frominvert,锚文本anchors

<url,CrawlDatum>from

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论