*The Natural Science Foundation of Hunan Province of China under Grant No. 07555084 (湖南省自然科学基金); the Science and Technology Projects of Guangdong Province under Grant No. 2009B080701031 (广东省科技计划项目). Received 2010-04, Accepted 2010-06.ISSN 1673-9418 CODEN JKYTA8 E-mail: fcst@ Journal of Frontiers of Computer Science and Technology 1673-9418/2011/05(01)-0068-07 Tel: +86-10-51616056DOI: 10.3778/j.issn.1673-9418.2011.01.007Nutch 分布式网络爬虫研究与优化*詹恒飞1+, 杨岳湘2, 方 宏21. 国防科学技术大学 计算机学院, 长沙 4100732. 国防科学技术大学 信息中心, 长沙 410073Research and Optimization of Nutch Distributed Crawler *ZHAN Hengfei 1+, YANG Yuexiang 2, FANG Hong 21. School of Computer Science, National University of Defense Technology, Changsha 410073, China2. Information Center, National University of Defense Technology, Changsha 410073, China + Corresponding author: E-mail: zhf_a_b@16ZHAN Hengfei, YANG Yuexiang, FANG Hong. Research and optimization of Nutch distributed crawler. Journal of Frontiers of Computer Science and Technology, 2011, 5(1): 68-74.Abstract: As a good open-source search engine, Nutch kernel code uses a lot of MapReduce programming models, being used by more and more businesses and organizations to customize their needs in line with the distributed search engine product. As a good search engine, one of the important prerequisites is how to grab network data as much as possible to build indexes. This paper introduces Nutch’s working mechanism based on Hadoop distributed Web crawler, points out its shortcomings and proposes an improved program, which can make Web crawler using network resources more efficiently to capture network data. Experimental results show that it is indeed more effi-cient than the original programs.Key words: Nutch; Web crawler; flexible crawling摘 要: Nutch 作为一个优秀的开源搜索引擎, 其内核代码大量采用了MapReduce 的编程模式, 被越来越多的企业和团体用来定制符合自身需求的分布式搜索引擎产品。
作为优秀的搜索引擎, 其重要的前提是如何詹恒飞等:Nutch分布式网络爬虫研究与优化69尽可能多地抓取到网页数据来建立索引。
介绍了Nutch基于Hadoop下的分布式网络爬虫工作机制, 指出其不足之处, 并提出了改进方案, 从而使网络爬虫能够更加高效地利用网络资源来抓取网络数据。
经过实验测试, 证明了此方案比原方案更加高效。
关键词: Nutch搜索引擎; 网络爬虫; 弹性抓取机制文献标识码:A 中图分类号:TP3931引言网络爬虫是搜索引擎的一个重要组成部分, 一个好的网络爬虫往往有爬行速度快、获取数据量大和获取信息准确等优点。
在目前因特网规模飞速膨胀, 每天都会产生大量新网页的形势下, 如何令网络爬虫更加高效, 可以在同样的时间里抓取到更多的有效网页就变得十分重要了。
2技术背景Nutch是一个基于Lucene的优秀开源搜索引擎, 它是最早用到MapReduce的项目(Hadoop原来是Nutch的一部分)。
如今, MapReduce编程方式占据了Nutch核心结构的大部分, 它极大地方便了编程人员在不会分布式并行编程的情况下, 将自己的程序运行在分布式系统上。
Nutch主要分为两个部分:网络爬虫和查询[1]。
网络爬虫的主要作用是从网络上抓取网页数据并建立索引; 查询则主要是利用这些索引来检索用户所提交的关键词并产生和返回查找结果。
两大部分之间的交汇点是索引, 耦合度相对较低。
2.1 MapReduce介绍MapReduce是一种编程模型, 用于大规模数据集(大于1TB)的并行运算。
概念“Map(映射)”和“Reduce(化简)”, 以及他们的主要思想, 都是从函数式编程语言和矢量编程语言里借来的特性[2]。
该模型的核心是Map和Reduce两个函数, 这两个函数由用户实现, 功能是按一定的映射规则将输入的<key,value>对转换成另一个或一批<key,value>对输出[3]。
图1说明了用MapReduce来处理大数据集的过程。
简而言之, MapReduce的计算过程就是将大数据集分解为成百上千的小数据集, 经过任务分发器, 将每个(或若干个)数据集分别由集群中的一个结点进行处理并生成中间结果, 然后这些中间结果又由若干个结点进行并行的多次合并, 形成最终结果。
最简单的MapReduce应用程序只需包含三个部分:Map函数、Reduce函数和Main函数。
主要是实现Map和Reduce函数, Main函数则将作业控制和文件输入/输出结合起来。
其他并行编程中的复杂问题, 均由Hadoop处理[4]。
Fig.1 MapReduce process图1 MapReduce过程图2.2 Nutch网络爬虫工作过程Nutch基于MapReduce模式的分布式网络爬虫工作过程, 如下所示[5]。
读取URL种子文件到Crawl DB, 然后进行下面的抓取程序。
(1) 循环①~④到指定的抓取深度:①从Crawl DB生成抓取列表;②根据抓取列表中的URL抓取网页;③分析处理抓取的内容;④更新Crawl DB库。
(2) 转化每个页面中外部对它的链接。
(3) 建立索引。
具体过程如图2所示。
其中的各个模块分别为:70Journal of Frontiers of Computer Science and Technology 计算机科学与探索 2011, 5(1)Fig.2 Nutch crawler workflow图2 Nutch 网络爬虫工作流程图插入URL 列表(Inject) 1)(1) 将URL 集合进行格式化、过滤和合并, 消除其中的非法URL, 并设定URL 状态(unfetched)和初始化分值;(2) 将URL 及其状态、分值存入Crawl DB 数据库, 与原数据库中重复则更换成新的。
下面用Inject 模块的例子说明MapReduce 的工作过程。
MapReduce 程序1目的: 将输入转换为CrawlDatum 格式 输入: URL 文件Map (line ) → <URL , CrawlDatum > Reduce()合并多重的URL 输出: 临时的CrawlDatum 文件MapReduce 程序2目的: 合并上一步产生的临时文件到新的DB 输入: 上次MapReduce 输出的CrawlDatum Map()过滤重复的URLReduce()合并两个CrawlDatum 到一个新的DB输出: CrawlDatum生成抓取列表(Generate)(1) 从Crawl DB 数据库中将URL 取出并按预设规则进行过滤;(2) 对URL 进行降序排列;(3) 将排列列表写入segments 目录中。
抓取内容(Fetch)(1) 对segments 目录下的抓取列表执行依次 抓取;(2) 抓取过程中, 页面的URL 地址可能会发生跳转, 从而需要重定向URL 地址;(3) 抓取过程采用多线程方式进行, Fetch 操作过程中得到页面源文件后同时也调用Parse 操作。
分析处理内容(Parse)使用对应的插件解析segments 目录中由Fetch 得到的页面, 并进行整理, 将页面分解为parse-date 和parse-text 。
parse-date 中保存的是页面的题名、作者、日期、链接等内容; parse-text 中保存的是页面的文本内容。
1) /forwen/archive/2009/11/13/4804733.aspx.詹恒飞等:Nutch分布式网络爬虫研究与优化71更新Crawl DB库(Update )根据segments目录下crawl_fetch目录和crawl_ parse目录中的内容, 对Crawl DB进行更新, 增加新的URL。
转化链接(Invert Links)Invert Links操作用来更新Link DB, 为建立索引的工作提供准备。
建立索引(Index)索引过程主要包括:将数据转换成文本、分析文本和将分析过的文本保存到索引库中这三个操作。
3 Nutch爬虫存在问题经过研究与测试, 发现Nutch网络爬虫存在以下问题, 影响了其性能的进一步提高:(1) 等待时间僵化Nutch网络爬虫抓取数据主要是使用protocol- http插件来完成。