概述
实在是看不下去Nutch官方的坑爹教程了,总结一套看完能懂的Nutch教程,持续更新中。
开发环境和基础:
学习Nutch,必须满足以下几个条件,缺一不可:
1)Linux环境,实在是没办法就在Windows上装Linux虚拟机。
2)熟悉JAVA。
3)有hadoop基础,能够编写hadoop下map reduce程序。
4)能够看懂Linux Shell。
下面来解释以下为什么需要满足这些条件。Nutch是在hadoop上运行的,windows下跑hadoop有一定的问题。并且Nutch中流程的控制使用的是Linux Shell,在windows上实现也比较麻烦。如果看不懂Linux Shell,就看不懂Nutch的流程。Nutch被切分成几个流程,每个流程都由Map Reduce完成,如果没有Map Reduce编程的基础,就看不懂Nutch源码。
源码阅读:
千万不要拿Nutch源码作为爬虫入门的教程。在学习Nutch之前最好先找一个单机爬虫熟悉爬虫的流程和基础。如果连Http请求、网页信息抽取这些最基础的技术细节都搞不清楚,阅读Nutch源码是没有用的,虽然说Nutch的http请求、网页解析是通过插件来完成的,但是我可以告诉你,如果你对Nutch的工作流程不是非常了解,是写不了Nutch插件的,哪怕是最简单的插件,所以不要想通过阅读Nutch插件的方法,来学习怎么发送http请求这种基础。更重要的是,在阅读Nutch源码之前,一定要了解爬虫的流程。Nutch中每个流程的输入输出都存放在hadoop文件中,文件是SequenceFIle,直接无法正确阅读文件的内容,如果想通过观察SequenceFile来了解爬虫的流程,是比较困难的。JAVA开源的单机爬虫有很多种,和Nutch流程最相似的是WebCollector。WebCollector和Nutch一样,都是将完整广度遍历切分成一层一层的爬取(每一层对应树的一层),有相同的链接存储、更新机制,采用相同的线程池,可以通过阅读WebCollector的源码来作为学习Nutch的基础。
分布式:
乱码?索引?:
开发工具:
二次开发:
版本:
除了文档欠缺、版本不稳定之外,Nutch2.x的持久化也是一个大问题。先说Nutch2.x利用mysql做持久化,这就是一个搞笑的设定。在hadoop上跑程序,用mysql作为输入输出,效率大家都懂得。而且选用Nutch作为爬虫,一般都是要处理几千万以上的数据。Mysql存一般多万网页已经可以崩溃了。其实我一直觉得官方也不想给出Nutch2.x持久化到mysql这种设定,我觉得官方只是想告诉大家,Nutch2.x使用的gora可以通过配置,将数据持久化到各种数据库。
很多人冲着Nutch 2.x可以持久化到hbase,而选用Nutch 2.x,当然配成功的很少,最后使用的更少。对于Nutch2.x与hbase,需要了解下面几点:
1)hbase的宗旨是提供一个无穷大的存储,hbase中每行数据都有一个唯一的key,在hbase中对数据的查询最好是在已知key的情况下进行,但是很多用户的需求,是想通过与sql中select操作类似的方法来查询数据,这种不可取。
2)Nutch 2.x所谓的存储数据到hbase,是将一些爬取辅助信息(历史爬取历史)、网页源码和链接分析信息存储到hbase中。如果你想用爬虫完成一边爬去一边抽取精数据,然后放入hbase,你需要自己去写插入hbase的操作,并不能通过Nutch 2.x自带的功能完成。
3)hbase如果崩溃,修复并不是很容易。很有可能爬了一个月的数据就救不回来了。
根据我的经验,Nutch 1.x可以为企业提供一个非常稳定的爬虫。虽然他并没有使用数据库来维护数据,但是它的稳定性却远远高于目前的Nutch 2.x版本。Nutch使用文件来维护所有的爬取信息(hdfs中的文件),Nutch 1.x将每个任务的数据都分别新建一个(或者多个)文件夹来管理(默认文件夹名是当前时间),并且对文件有一定的备份机制,本身就很少出致命错误(导致文件损坏不能用的错误)。如果遇到极端情况,导致文件损坏,可以通过删除损坏文件来轻松恢复,因为每次任务只会影响到当时新建的文件夹(这里描述并不是非常准确,后面教程中解释)。
有一些工程师不能接受这种设定,他们原来是做基于关系型数据库的系统出生的,对于用文件存储数据这种设定不是很能接受。这种习惯要改改了,至少目前,做hadoop这套东西,基于hdfs中文件去存储、管理海量数据,还是一个比较稳定的方案。hdfs中有一种文件叫SequenceFile,这种文件将java对象保存到文件中,也就是说,可以利用文件存储结构化信息,所以不用担心用文件存储不了复杂结构的数据。Nutch 1.x中所有的数据都是用SequenceFIle的形式来存储的。
最后说个题外话,Nutch 2.x之所以用hbase作为存储,有一个很重要的原因是,Nutch是为搜索引擎设计的爬虫,用hbase可以完成mysql实现不了的链接分析的功能。我们知道互联网中的链接信息,用mysql无法实现大量的存储,门户网站一个页面就有几十个外链,随便几十万个网页就可以把mysql弄报废,而且数据量一大查询效率你懂得。但是hbase就可以很好地完成这个功能。Nutch 2.x的hbase中,有一个列族叫outlink,这个列族用来存储每个页面的所有外链信息,列名是链接的url,列值是链接的锚文本。例如一个网页http://www.abc.com有2个外链,一个指向百度首页,一个指向新浪首页。在hbase里就是:
row_key:"http://www.abc.com: outlink:http://www.baidu.com:百度一下,你就知道
row_key:"http://www.abc.com: outlink:http://www.sina.com:新浪首页
这里注意一下,http://www.baidu.com和http://www.sina.com并不是值,而是列名。hbase中列族不可以随便增加,但是列是可以随意添加的。可想而知,当爬虫爬取后,hbase的outlink列族中,会有几百万个列(有多少不同的链接url,就有多少列)。这样存储,我们就可以很快地查询互联网中两个页面之间的关系。例如我们想查询http://www.abc.com和http://ww.baidu.com这两个页面之间的关系,只需要查询hbase中,row_key为http://www.abc.com的行中,列族为outlink,列名为http://www.abc.com的单元的值即可。这种查询操作在搜索引擎的链接分析中有非常重要的作用。但是如果一个企业只是想对互联网中的新闻进行爬取、舆情分析,极少会有这种需求。
所以如果企业想使用分布式爬虫,并且不是为了专门做搜索引擎,最好使用Nutch 1.x。不要为了使用”高端“的nosql(hbase),而去强行使用Nutch 2.x。
最后
以上就是可靠鸵鸟为你收集整理的Nutch教程——准备篇 by 逼格DATA的全部内容,希望文章能够帮你解决Nutch教程——准备篇 by 逼格DATA所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复