分享

Nutch 快速入门(Nutch 2.2.1)

nettman 2015-4-13 19:57:27 发表于 入门帮助 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 4 20946
本帖最后由 nettman 于 2015-4-13 19:57 编辑
问题导读
1.如何配置nutch存储数据到hbase?
2.如何过滤种子URL?
3.如何将Nutch与Solr集成在一起?



本文主要参考Nutch 2.x Tutorial
Nutch 2.x 与 Nutch 1.x 相比,剥离出了存储层,放到了gora中,可以使用多种数据库,例如HBase, Cassandra, MySql来存储数据了。Nutch 1.7 则是把数据直接存储在HDFS上。
1. 安装并运行HBase
为了简单起见,使用Standalone模式,参考 HBase Quick start
1.1 下载,解压
  1. wget http://archive.apache.org/dist/hbase/hbase-0.90.4/hbase-0.90.4.tar.gz
  2. tar zxf hbase-0.90.4.tar.gz
复制代码


1.2 修改 conf/hbase-site.xml
内容如下
  1. <configuration>
  2.   <property>
  3.     <name>hbase.rootdir</name>
  4.     <value>file:///DIRECTORY/hbase</value>
  5.   </property>
  6.   <property>
  7.     <name>hbase.zookeeper.property.dataDir</name>
  8.     <value>/DIRECTORY/zookeeper</value>
  9.   </property>
  10. </configuration>
复制代码
hbase.rootdir目录是用来存放HBase的相关信息的,默认值是/tmp/hbase-${user.name}/hbase; hbase.zookeeper.property.dataDir目录是用来存放zookeeper(HBase内置了zookeeper)的相关信息的,默认值是/tmp/hbase-${user.name}/zookeeper。

1.3 启动
  1. $ ./bin/start-hbase.sh
  2. starting Master, logging to logs/hbase-user-master-example.org.out
复制代码


1.4 试用一下shell
$ ./bin/hbase shell HBase Shell; enter ‘help’ for list of supported commands. Type “exit” to leave the HBase Shell Version 0.90.4, r1150278, Sun Jul 24 15:53:29 PDT 2011
hbase(main):001:0>
创建一张名字为test的表,只有一个列,名为cf。为了验证创建是否成功,用list命令查看所有的table,并用put命令插入一些值。
  1. hbase(main):003:0> create 'test', 'cf'
  2. 0 row(s) in 1.2200 seconds
  3. hbase(main):003:0> list 'test'
  4. ..
  5. 1 row(s) in 0.0550 seconds
  6. hbase(main):004:0> put 'test', 'row1', 'cf:a', 'value1'
  7. 0 row(s) in 0.0560 seconds
  8. hbase(main):005:0> put 'test', 'row2', 'cf:b', 'value2'
  9. 0 row(s) in 0.0370 seconds
  10. hbase(main):006:0> put 'test', 'row3', 'cf:c', 'value3'
  11. 0 row(s) in 0.0450 seconds
复制代码

用scan命令扫描table,验证一下刚才的插入是否成功。
  1. hbase(main):007:0> scan 'test'
  2. ROW        COLUMN+CELL
  3. row1       column=cf:a, timestamp=1288380727188, value=value1
  4. row2       column=cf:b, timestamp=1288380738440, value=value2
  5. row3       column=cf:c, timestamp=1288380747365, value=value3
  6. 3 row(s) in 0.0590 seconds
复制代码

现在,disable并drop掉你的表,这会把上面的所有操作清零。
  1. hbase(main):012:0> disable 'test'
  2. 0 row(s) in 1.0930 seconds
  3. hbase(main):013:0> drop 'test'
  4. 0 row(s) in 0.0770 seconds
复制代码

退出shell,
  1. hbase(main):014:0> exit
复制代码

1.5 停止
  1. $ ./bin/stop-hbase.sh
  2. stopping hbase...............
复制代码


1.6 再次启动
后面运行Nutch,需要把数据存储到HBase,因此需要启动HBase。
  1. $ ./bin/start-hbase.sh
  2. starting Master, logging to logs/hbase-user-master-example.org.out
复制代码

2 编译Nutch 2.2.12.1 下载,解压
  1. wget http://www.apache.org/dyn/closer.cgi/nutch/2.2.1/apache-nutch-2.2.1-src.tar.gz
  2. tar zxf apache-nutch-2.2.1-src.tar.gz
复制代码


2.2 修改配置文件
修改 conf/nutch-site.xml
  1. <property>
  2.   <name>storage.data.store.class</name>
  3.   <value>org.apache.gora.hbase.store.HBaseStore</value>
  4.   <description>Default class for storing data</description>
  5. </property>
复制代码

修改ivy/ivy.xml
  1. <!-- Uncomment this to use HBase as Gora backend. -->
  2. <dependency org="org.apache.gora" name="gora-hbase" rev="0.3" conf="*->default" />
复制代码
修改 conf/gora.properties,确保HBaseStore被设置为默认的存储,
  1. gora.datastore.default=org.apache.gora.hbase.store.HBaseStore
复制代码

2.3 编译
  1. ant runtime
复制代码


刚开始会下载很多jar,需要等待一段时间。
有可能你会得到如下错误:
  1. Trying to override old definition of task javac
  2.   [taskdef] Could not load definitions from resource org/sonar/ant/antlib.xml. It could not be found.
  3. ivy-probe-antlib:
  4. ivy-download:
  5.   [taskdef] Could not load definitions from resource org/sonar/ant/antlib.xml. It could not be found.
复制代码

无所谓,不用管它。
要等一会儿才能编译结束。编译完后,多出来了 build 和 runtime两个文件夹。

3 添加种子URL
  1. mkdir ~/urls
  2. vim ~/urls/seed.txt
  3. http://movie.douban.com/subject/5323968/
复制代码


4 设置URL过滤规则
如果只想抓取某种类型的URL,可以在 conf/regex-urlfilter.txt设置正则表达式,于是,只有匹配这些正则表达式的URL才会被抓取。
例如,我只想抓取豆瓣电影的数据,可以这样设置:
  1. #注释掉这一行
  2. # skip URLs containing certain characters as probable queries, etc.
  3. #-[?*!@=]
  4. # accept anything else
  5. #注释掉这行
  6. #+.
  7. +^http:\/\/movie\.douban\.com\/subject\/[0-9]+\/(\?.+)?$
复制代码

5 设置agent名字
conf/nutch-site.xml:
  1. <property>
  2.   <name>http.agent.name</name>
  3.   <value>My Nutch Spider</value>
  4. </property>
复制代码

这一步是从这本书上看到的,Web Crawling and Data Mining with Apache Nutch,第14页。
6 安装Solr
由于建索引的时候需要使用Solr,因此我们需要安装并启动一个Solr服务器。
参考Nutch Tutorial 第4、5、6步,以及Solr Tutorial
6.1 下载,解压6.2 运行Solr
  1. cd example
  2. java -jar start.jar
复制代码


验证是否启动成功
用浏览器打开 http://localhost:8983/solr/admin/,如果能看到页面,说明启动成功。
6.3 将Nutch与Solr集成在一起
将NUTCH_DIR/conf/schema-solr4.xml拷贝到SOLR_DIR/solr/collection1/conf/,重命名为schema.xml,并在<fields>...</fields>最后添加一行(具体解释见Solr 4.2 - what is _version_field?),
  1. <field name="_version_" type="long" indexed="true" stored="true" multiValued="false"/>
复制代码

重启Solr,
  1. # Ctrl+C to stop Solr
  2. java -jar start.jar
复制代码

第7步和第8步也和Nutch 1.7那篇博客中的7、8步很类似。主要区别在于,Nutch 2.x的所有数据,不再以文件和目录的形式存放在硬盘上,而是存放到HBase里。
7 一步一步使用单个命令抓取网页
TODO
8 使用crawl脚本一键抓取
刚才我们是手工敲入多个命令,一个一个步骤,来完成抓取的,其实Nutch自带了一个脚本,./bin/crawl,把抓取的各个步骤合并成一个命令,看一下它的用法
  1. $ ./bin/crawl
  2. Missing seedDir : crawl <seedDir> <crawlID> <solrURL> <numberOfRounds>
复制代码
注意,这里是crawlId,不再是crawlDir。
先删除第7节产生的数据,使用HBase shell,用disable删除表。

8.1 抓取网页
  1. $ ./bin/crawl ~/urls/ TestCrawl http://localhost:8983/solr/ 2
复制代码


  • ~/urls 是存放了种子url的目录
  • TestCrawl 是crawlId,这会在HBase中创建一张以crawlId为前缀的表,例如TestCrawl_Webpage。
  • http://localhost:8983/solr/ , 这是Solr服务器
  • 2,numberOfRounds,迭代的次数
过了一会儿,屏幕上出现了一大堆url,可以看到爬虫正在抓取!
  1. fetching http://music.douban.com/subject/25811077/ (queue crawl delay=5000ms)
  2. fetching http://read.douban.com/ebook/1919781 (queue crawl delay=5000ms)
  3. fetching http://www.douban.com/online/11670861/ (queue crawl delay=5000ms)
  4. fetching http://book.douban.com/tag/绘本 (queue crawl delay=5000ms)
  5. fetching http://movie.douban.com/tag/科幻 (queue crawl delay=5000ms)
  6. 49/50 spinwaiting/active, 56 pages, 0 errors, 0.9 1 pages/s, 332 245 kb/s, 131 URLs in 5 queues
  7. fetching http://music.douban.com/subject/25762454/ (queue crawl delay=5000ms)
  8. fetching http://read.douban.com/reader/ebook/1951242/ (queue crawl delay=5000ms)
  9. fetching http://www.douban.com/mobile/read-notes (queue crawl delay=5000ms)
  10. fetching http://book.douban.com/tag/诗歌 (queue crawl delay=5000ms)
  11. 50/50 spinwaiting/active, 61 pages, 0 errors, 0.9 1 pages/s, 334 366 kb/s, 127 URLs in 5 queues
复制代码

8.2 查看结果
  1. ./bin/nutch readdb -crawlId TestCrawl -stats
复制代码


也可以进HBase shell 查看,
  1. cd ~/hbase-0.90.4
  2. ./bin/hbase shell
  3. hbase(main):001:0> scan 'TestCrawl_webpage'
复制代码

屏幕开始不断输出内容,可以用Ctrl+C 结束。
在运行scan查看表中内容时,对于列的含义不确定时可以查看conf/gora-hbase-mapping.xml文件,该文件定义了列族及列的含义。

加微信w3aboutyun,可拉入技术爱好者群

已有(4)人评论

跳转到指定楼层
271592448 发表于 2015-4-14 09:10:00
回复

使用道具 举报

tang 发表于 2015-6-19 21:46:40
赞一个,很不错的
回复

使用道具 举报

Jeelon 发表于 2016-8-1 16:55:00
请问下大神 抓取网页后把索引数据导入solr(solr-4.10.0)的时候报错了,那么现在要把hbase的数据重新手动导入到solr应该怎么做呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条