提高nutch爬取效率
提高nutch爬取效率
分类:搜索引擎Nutch2011-03-0911:08638人阅读评论(0)收藏举报
Herearethethingsthatcouldpotentiallyslowdownfetching
下面这些是潜在的影响爬取效率的内容:
1)DNSsetup
2)Thenumberofcrawlersyouhave,toomany,toofew.
3)Bandwidthlimitations
4)Numberofthreadsperhost(politeness)
5)Unevendistributionofurlstofetchandpoliteness.
6)Highcrawl-delaysfromrobots.txt(usuallyalongwithanunevendistributionofurls).
7)Manyslowwebsites(againusuallywithanunevendistribution).
8)Downloadinglotsofcontent(PDFS,verylargehtmlpages,againpossiblyanunevendistribution).
9)Others
1)DNS设置
2)你的爬虫数量,太多或太少
3)带宽限制
4)每一主机的线程数
5)要抓取的urls的分配不均匀
6)robots.txt中的高爬取延时(通常和urls的分配不均匀同时出现)
7)有很多比较慢的网页(通常和分配不均匀同时出现)
8)要下载太多的内容(PDF,大的html页面,通常和分配不均匀同时出现)
9)其它
Nowhowdowefixthem
那现在怎样改善它们?
1)HaveaDNSsetuponeachlocalcrawlingmachine,ifmultiplecrawlingmachinesandasinglecentralizedDNSit
canactlikeaDOSattackontheDNSserverslowingtheentiresystem.Wealwaysdidatwolayersetuphitting
firsttothelocalDNScachethentoalargeDNScachelikeOpenDNSorVerizon.
1)在每一个本地的爬虫机器上设置DNS,如果是多个爬取机器和一个单独的DNS中心这种情况,那么它就会像有DOS攻击在DNS服务
器上那样,使整个系统变慢。我们经常设置两层,首先命中本地DNS缓存,然后就是大的DNS缓存,就像OpenDNS或Verizon。
2)Thiswouldbenumberofmaptasks*fetcher.threads.fetch.So10maptasks*20threads=200fetchersat
once.Toomanyandyouoverloadyoursystem,toofewandotherfactorsandthemachinesitesidle.Youwillneed
toplayaroundwiththissettingforyoursetup.
2)这将是map任务数乘以fetcher.threads.fetch属性值的数量。所以10个map任务*20个线程=一次200个爬取列表。太多的话会超
过你系统的负担,太少的话就会使一些机器闲置。你需要认真考虑在你的环境下如何设置这些属性。
3)Bandwidthlimitations.Usentop,ganglia,andothermonitoringtoolstodeterminehowmuchbandwidthyouare
using.Accountforinandoutbandwidth.Asimpletest,fromaserverinsidethefetchingnetworkbutnotitself
fetching,ifitisveryslowconnectingtoordownloadingcontentwhenfetchingisoccurring,itisagoodbet
youaremaxingoutbandwidth.Ifyousethttptimeoutaswedescribelaterandaremaxingyourbandwidth,you
willstartseeingmanyhttptimeouterrors.
3)带宽限制,用ntop,ganglia和其它监控软件来测定你使用了多少的带宽。计算输入和输出的带宽。可以做一个简单的测试,
用抓取网络中一台不用作爬虫的服务器中,如果它与其中一台爬虫机器连接时或当那台机器抓取时从中下载信息时非常慢,这时
你就可以加大带宽。如果你像我后来说的那样设置http的超时时间并且增加了你的带宽,你会开始看到很多http超时的错误。
4)Politenessalongwithunevendistributionofurlsisprobablythebiggestlimitingfactor.Ifonethreadis
processingasinglesiteandtherearealotofurlsfromthatsitetofetchallotherthreadswillsitidle
whilethatonethreadfinishes.Somesolutions,usefetcher.server.delaytoshortenthetimebetweenpagefetches
andusefetcher.threads.per.hosttoincreasethenumberofthreadsfetchingforasinglesite(thiswouldstill
beinthesamemaptaskthoughandhencethesameJVMChildTaskprocess).Ifincreasingthis>0youcouldalso
setfetcher.server.min.delaytosomevalue>0forpolitenesstominandmaxboundtheprocess.
4)urls分配的不均匀很有可能是限制性能的一个最大的因素。如果一个线程正在处理一个网站并且那个网站还有很多url等待抓
取,那么其它线程就会闲置直到那个线程完成抓取。一些解决方法是,使用fetcher.server.delay来缩短网页抓取之间的时间间
隔,和使用fetcher.threads.per.host来增加同一网站抓取的线程数(这仍然在同一个map任务中,因此也是在同一个JVM中的子
任务中处理)。如果把这些属性都设置为大于0,你也可以设置fetcher.server.min.delay属性大于0来设置处理的最小和最大的
界限。
5)Fetchingalotofpagesfromasinglesiteoralotofpagesfromafewsiteswillslowdownfetching
dramatically.Forfullwebcrawlsyouwantanevendistributionsoallfetchingthreadscanbeactive.Setting
generate.max.per.hosttoavalue>0willlimitthenumberofpagesfromasinglehost/domaintofetch.
5)在一个网站上抓取大量的网页或在少量网站上抓取大量的网页将显著地降低抓取的速度。对于全网爬取,你希望用分布式环境
来使所有抓取线程活动。设置generate.max.per.host大于0将限制在同一网站/域名抓取网页的数量。
6)Crawl-delaycanbeusedandisobeyedbynutchinrobots.txt.Mostsitesdon'tusethissettingbutafew
(somemaliciousdo).Ihaveseencrawl-delaysashighas2daysinseconds.Thefetcher.max.crawl.delayvariable
willignorepageswithcrawldelays>x.Iusuallysetthisto10seconds,defaultis30.Evenat10secondsif
youhavealotofpagesfromasitefromwhichyoucanonlycrawl1pageevery10secondsitisgoingtobeslow.
Ontheflipside,settingthistoalowvaluewillignoreandnotfetchthosepages.
6)爬取延迟。大多数网站不使用这些设置只有少数使用(一些恶意的网站)。我见过爬取延迟每秒最长延迟2天的。
fetcher.max.crawl.delay属性将忽略爬取延迟大于x的页面。我经常把它设置成10秒,默认是30秒。尽管设置为10秒,如果你在
某个网站上有大量的页面要爬取,但你只能每10秒爬取一个页面,这样也是很慢的。另一方面,把它的值设置过小将忽略该页面
并且不抓取这些网页。
7)Sometimes,manytimeswebsitesarejustslow.Settingalowvalueforhttp.timeouthelps.Thedefaultis10
seconds.Ifyoudon'tcareandwantasmanypagesasfastaspossible,setitlower.Somewebsites,diggfor
instance,willbandwidthlimityouontheirsideonlyallowingxconnectionspergiventimeframe.Soevenifyou
onlyhavesay50pagesfromasinglesite(whichIstillthinkistomany).Itmaybewaiting10secondsoneach
page.Theftp.timeoutcanalsobesetiffetchingftpcontent.
7)有时,网页刚好很慢。设置http.timeout一个低点的值就有助于这种情况。它的默认值为10秒。如果你不在意并想所有网页都
尽可能的快,设置得小点。一些网站。例如digg,会在网站中限制你的带宽并且只允许在某个时间段内存在x个到你机器的连接。所以即使你只在一个网站中爬取50个网页(我仍然认为太多了)。这样将在每一页面中等待10秒。ftp.timeout也可以用来设置抓取ftp的内容时的时间间隔。
8)Lotsofcontentmeansslowerfetching.IfdownloadingPDFsandothernon-htmldocumentsthisisespecially
true.Toavoidnon-htmlcontentyoucanusetheurlfilters.Iprefertheprefixandsuffixfilters.The
http.content.limitandftp.content.limitcanbeusedtolimittheamountofcontentdownloadedforasingle
document.
8)大量的内容意味着要降低抓取的速度。特别是下载PDF或其它非html的文件时。为了避免下载非html的内容,你可以使用url过
滤器。我更喜欢prefix和suffix过滤器。http.content.limit和ftp.content.limit属性可以限制一个文档中下载数据的多少。
9)Otherthingsthatcouldbecausingslowfetching:
Maxthenumberofopensockets/filesonamachine.YouwillstartseeingIOerrorsorcan'topensocketerrors.
Poorrouting.Badroutersorhomeroutersmightnotbeabletohandlethenumberofconnectionsgoingthroughat
once.Anincorrectroutingsetupcouldalsobecausingproblemsbutthoseareusuallymuchmorecomplexto
diagnose.Usenetworktraceandmappingtoolsifyouthinkthisishappening.Upstreamroutingcanalsobea
problemfromyournetworkprovider.
Badnetworkcards.Ihaveseennetworkcardsfliponcetheyreachacertainbandwidthpoint.Thiswasmore
prevalenton,atthetime,newergigabitcards.Notusuallymyfirstthoughtbutalwaysapossibility.Use
tcpdumpandnetworkmonitoringtoolsonthesingleinterface.
9)其它可能导致抓取变慢的因素:
一台机器最大可打开的socket或文件的多少。你可能会开始看到IO错误或不能打开socket的错误。低效的路由。坏的或家里的路
由不能控制同一时间大量连接的建立。一个错误的路由设置也可能导致问题但这些问题通常很难发现。如果你认为是这个问题,
可以用网络跟踪和映射工具来查找。反向的路由则可能是你网络供应商的问题。坏的网卡。我曾经见过一些网卡突然达到了某个
带宽值。这个问题在使用新的网卡时更加普遍。这通常不是我首先想到的但是通常是可能会出现的。可以使用tcpdump和网络监控
工具来检查那个网络接口。
Thatisaboutitfrommyperspective.Feelfreetoaddanythingifanybodyelsethinksofotherthings.
这些是我的观点。如果大家还想到其它的因素,欢迎补充。