工作分析NC工作流程及文件格式详细分析.docx
《工作分析NC工作流程及文件格式详细分析.docx》由会员分享,可在线阅读,更多相关《工作分析NC工作流程及文件格式详细分析.docx(8页珍藏版)》请在冰豆网上搜索。
工作分析NC工作流程及文件格式详细分析
(工作分析)NC工作流程及文件格式详细分析
NutchCrawler工作流程及文件格式详细分析
Crawler和Searcher俩部分被尽是分开,其主要目的是为了使俩个部分能够布地配置于硬件平台上,例如Crawler和Searcher分别被放置于俩个主机上,这样能够极大的提高灵活性和性能。
壹、总体介绍:
1、先注入种子urls到crawldb
2、循环:
∙generate从crawldb中生成壹个url的子集用于抓取
∙fetch抓取上壹小的url生成壹个个segment
∙parse分析已抓取segment的内容
∙update把已抓取的数据更新到原先的crawldb
3、从已抓取的segments中分析出link地图
4、索引segment文本及inlink锚文本
二、关联的数据结构:
CrawlDB
●CrawlDb是壹个包含如下结构数据的文件:
●CrawlDatum:
●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
首先是建立起始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)→;status=db_unfetched
Reduce()isidentity;
Output:
临时的输出文件夹
●MapReduce2:
合且到现有的DB
Input:
第壹步的输出和已存于的DB文件
Map()isidentity.
Reduce:
合且CrawlDatum成壹个实体(entry)
Out:
壹个新的DB
2、Generatorgenerator=newGenerator(conf);//Generatesasubsetofacrawldbtofetch
Usage:
Generator[-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
Partition以随机的hash值来分组
Reduce:
compare()以CrawlDatum.linkCount的降序排列
outputonlytop-Nmost-linkedentries
●MapReduce2:
为下壹步抓取准备
Map()isinvert;Partition()byhost,Reduce()isidentity.
Out:
包含要且行抓取的文件
3、Fetcherfetcher=newFetcher(conf);//Thefetcher.Mostoftheworkisdonebyplugins
Usage:
Fetcher[-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:
,以host分区,以hash值排序
Map(url,CrawlDatum)→
多线程的,同步的map实现
调用已有的协议protocol插件
FetcherOutput:
Reduceisidentity
Out:
俩个文件:
,
4、ParseSegmentparseSegment=newParseSegment(conf);//Parsecontentinasegment
Usage:
ParseSegmentsegment
对于这个步骤的逻辑比较简单,只是对抓取后上壹步骤存储于segment里的content进行分析parse。
同样,这个步骤的具体工作也是由插件来完成的。
MapReduce:
分析内容
In:
抓取来的内容
Map(url,Content)→
调用分析插件parserplugins
Reduceisidentity.
Parse:
Out:
分割成三个文件:
,和为了outlinks.
5、CrawlDbcrawlDbTool=newCrawlDb(conf);//takestheoutputofthefetcherandupdatesthecrawldbaccordingly.
Usage:
CrawlDb(-dir|...)[-force][-normalize][-filter][-noAdditions]
这个类主要是根据fetcher的输出去更新crawldb。
map和reduce分别做了俩方面的事情,于map里是对url的nomalizer,和filte,于reduce里是对新抓取进来的页面(CrawlDatum)和原先已经存于的进行合且。
MapReduce:
合且抓取的和分析后的输出到crawldb里
In:
现有的db加上抓取后的和分析后的输出
Map()isidentity
Reduce()合且所有实体(entry)成壹个,以抓取后的状态覆盖原先的db状态信息,统计出分析后的链接数
Out:
新的crawldb
6.LinkDblinkDbTool=newLinkDb(conf);//Maintainsaninvertedlinkmap,listingincominglinksforeachurl.
Usage:
LinkDb(-dir|...)[-force][-noNormalize][-noFilter]
这个类的作用是管理新转化进来的链接映射,且列出每个url的外部链接(incominglinks)。
先是对每壹个url取出它的outLinks,作map操作把这个url作为每个outLinks的incominglink,于reduce里把根据每个key来把壹个url的所有incominglink均加到inlinks里。
这样就把每个url的外部链接统计出来了。
然后壹步是对这些新加进来的链接进行合且。
●MapReduce:
统计每个链接的外部链接
In:
,包含所有链接的分析后的结果
Map(srcUrl,ParseData>→
为每个链出链接收集壹个入链。
Inlinks:
*
Reduce()加上外部入链数量
Out:
,壹个关联完整的链接地图
7.Indexerindexer=newIndexer(conf);//Createindexesforsegments
Usage:
...
这个类的任务是另壹方面的工作了,它是基于hadoop和lucene的分布式索引。
它就是为前面爬虫抓取回来的数据进行索引好让用户能够搜索到这些数据。
这里的输入就比较多了,有segments下的fetch_dir,parseData和parseText,仍有crawldb下的current_dir和linkdb下的current_dir。
于这个类里,map也不做,于reduce时处理。
当然要把这些数据体组合成壹个lucene的document让它索引了。
于reduce里组装好后收集时是,最后于输出的OutputFormat类里进行真正的索引。
●MapReduce:
生成lucene的索引文件
In:
外个文件,values以包装
fromparse,有title,metadata,等等信息.
fromparse,文本text
frominvert,锚文本anchors
fromfetch,用于抓取
Map()isidentity
Reduce()生成LuceneDocument
调用index插件
Out:
建立Lucene索引;最后存储到文件系统上
8.DeleteDuplicatesdedup=newDeleteDuplicates(conf);//这个类的作用就是它的名字了。
Usage:
DeleteDuplicates...
这个类的作用就是这它的名字所写的意思--去重。
前面索引后(当然不是壹次时的情况)会有重复,所以要去重。
为什么呢,于壹次索引时是不重复的,可是多次抓取后就会有重复了。
就是这个原因才要去重。
当然去重的规则有俩种壹个是以时间为标准,壹种是以内容的md5值为标准。
9.IndexMergermerger=newIndexMerger(conf);
IndexMerger[-workingdir]outputIndexindexesDir...
这个类就比较简单了,把所有的小索引合且成壹个索引。
于这壹步没有用到map-reduce。
于这九大步骤中generator,fetcher,parseSegment,crawlDbTool会根据抓取的层数循环运行,当抓取的层数大于1时会运行linkInvert,index,dedup,和merge。