大数据方法论之Nutch基于Map-Reduce的爬取方法

叁叁肆2018-11-09 09:08

此文已由作者刘超授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验


随着人工智能的兴起,大数据又火了起来,大数据的方法论的本质是众人拾柴火焰高,从算法角度来讲,就是分治法。


例如普通的合并排序。



就是分治法的体现


分三个部分,第一分,Devide,将总的任务分成多个分任务。


第二,处理,Concur,每个人将分给自己的任务做完,输出结果


第三,合,Merge,每个人将任务结果汇总,得到最终结果。


对于大量数据来讲,数据的处理从单线程模型



到多线程模型



最终到多进程模型,也即Map-Reduce的基本思路




首先是分,Split,然后是处理,Map,然后是合并,Reduce,最终输出结果。


对于多进程来讲,需要一个控制器和调度器来控制多个进程的合作,所以有了Map-Reduce的两个版本的框架,以及后来有了Spark。


网页的爬取系统Nutch就是一个使用了Map-Reduce的典型框架。



对于如图的一个网页体系,对它进行广度优先搜索


然而这个算法本身是并行不起来的。因为广度优先搜索的时候,需要对节点着色,保证同一个节点只能抓取一次。


为了保证能够并行起来,因而大数据算法中的一个常见的做法是,先分开做,大家做重了没关系,因为数据量大,不需要那么准确,多一篇少一篇无所谓,而且我们可以后期的去重。



所以整个Nutch的爬取过程分成了多个Map-Reduce进行。



首先人手工指定一个初始的网页url列表,往往包括最牛的网站,例如门户网站,也会包括行业网站,例如财经领域,则会有财经垂直领域的著名网站。


这些网页的url列表形成一个初始的爬取库crawdb,这里面包含已经爬取过的,和未曾爬取过的,都放在这里面,当然一开始都是未爬取的。


Generator从crawdb中抽取出那些未爬取的里面高优先级的,比如质量更好的url等,进入库craw_generete


Fetcher从craw_generete中通过map-reduce分发这些未爬取的任务开始爬取,爬取的结果放在craw_fetch里面,例如是否成功,爬取的真正的数据,也即网页的内容放在content里面。


Parse从content里面读取网页的内容,通过解析,一部分是网页的正文文字,放在parse_text里面,一部分是网页的链接,放在craw_parse里面,这里面的链接是可以再次爬取的。


updatedb也是一个map-reduce,通过合并原始的crawdb,此次爬取的状态craw_fetch,以及爬取下来的网页中的外链craw_parse,合并成新的爬取库crawdb_new,在这里面,已经爬取成功的和多次标记失败的,就不再爬取了,而新生成的外链,如果没有被爬取过,则入库,如果已经爬取过,就是上面说的重复了,就去重。


整个爬取的过程好复杂,包含这么多过程,而且每个过程都是一个map-reduce,每个都会从hdfs上读取,然后写入hdfs,性能很慢。于是后来有了Spark,可以将多个map-reduce穿起来,并且中间的处理过程全在内存里面,就快多了。


另外这么多map-reduce之间的关系也需要管理,可以防止一个图里面表示,这就是DAG(Directed Acyclical Graphs)


Hadoop的Map-reduce本身没有DAG,每个map-reduce是独立的,需要手动维护先后执行关系,后来有了Oozie,可以将多个map-reduce任务管理起来。


Spark的Map-reduce就有DAG。


11.1—11.15云计算基础服务全场5折起

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击