大数据方法论之Nutch基于Map-Reduce的爬取方法
随着人工智能的兴起,大数据又火了起来,大数据的方法论的本质是众人拾柴火焰高,从算法角度来讲,就是分治法。
例如普通的合并排序。
就是分治法的体现
分三个部分,第一分,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。