Nutch抓取优化

抓取优化设计方案

流程优化

将nutch默认的串行抓取流程改为并行抓取流程

串行流程介绍

nutch crawl流程图

crawl-flow

串行流程主要是这四个阶段:generate–>fetch–>parse–>updatedb,循环执行。

串行流程问题

当crawldb中数据量比较少时,fetch流程会占80%以上的时间,流程效率并不低。但是当crawldb中的url规模较大,例如百亿级别时,generate,parse和updatedb会占用大量时间,导致fetch流程的时间占比很低,甚至低于10%,极大地降低了抓取效率。从优化抓取量角度看,fetch流程应该在不断的运行。

并行流程

并发流程图

parallel-crawl-flow

generate,fetch,parse,updatedb四个流程并行执行,基于segments中的tag标签进行同步。

标签

标签 说明
tag_generate 待抓取url生成成功,可以抓取了
tag_fetching 正在抓取
tag_fetched 抓取成功,可以解析
tag_parsing 正在解析
tag_parsed 解析成功,可以更新
tag_updating 正在更新
tag_updated 完成更新,当前segment完成基础抓取流程

generate优化

generate流程的主要功能是生成待抓取的url列表。由于generate需要对crawldb中所有的url打分、排序,在crawldb很大时,会占用大量的时间和资源。即使在并行流程下,generate也会成为瓶颈。

多组带抓取列表

为了充分利用generate流程对所有url进行打分,排序,在一次流程中生成多组待抓取列表,即多个segment。

crawldb更新

generate改成并行,同时一次生成多组segment时,需要对crawldb进行更新,避免待抓取url的重复。这一步会占用一定时间。

fetch优化

fetch流程的抓取模型是一个多线程抓取模型。nutch默认会将同一个站点分配到一个节点去抓,方便对站点抓取量进行控制,也对被抓取站点比较友好。

dns缓存

随着抓取规模增大,并发抓取的站点增多,会给dns解析服务造成很大压力,同时也会影响抓取性能。需要设计dns换粗,当前的dns缓存有两层,对于fetcher来说有一个local的map缓存和一个remote的redis换粗。

白名单

支持配置某些站点优先抓取。

并发抓取

支持配置某些站点在抓取的所有节点同时抓。

parse优化

当每天的抓取量在2亿以上时,parse也会占用很多资源。默认parse流程会用三种输出:外链,元信息,正文。外链用于updatedb流程,云信息用于link相关流程。正文部分在目前的抓取流程中不需要,可以省略。

updatedb优化

默认updatedb会将一个抓取完成的segment更新到crawldb。当crawldb在百亿规模时,遍历一次会比较费时。设置成一次更新多个segment,提高效率。

yarn队列优化

在并发的四个流程中,fetch流程是最优先的。为了优先保证fetch流程拥有抓取资源。将调度队列分为两种:prior和default。

queue capacity max capacity
prior 60% 100%
default 40% 80%

fetch在prior队列运行,其他流程在default队列运行,保证即使集群最忙时,fetch依然有20%的资源可以使用。

空间优化

随着抓取规模不断扩大,数据会占用更多的空间。要及时的将抓取中间数据删除,同时对有意义的数据结果进行压缩。

参数
mapreduce.output.fileoutputformat.compress true
mapreduce.output.fileoutputformat.compress.type BLOCK

有道技术团队:Nutch优化