分享

把Nutch爬虫部署到Hadoop集群上

nettman 2015-4-17 15:11:00 发表于 实操演练 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 29521

问题导读

1.如何把Nutch爬虫部署到Hadoop集群上?
2.hadoop与nutch的结合点在什么地方?
3.修改Nutch的配置文件该如何修改?
4.如何向Hadoop集群提交Job,进行抓取?






前提
学会了搭建一个分布式Hadoop集群
学会了单机跑Nutch

1 启动Hadoop集群
伪分布式或真分布式的Hadoop集群都可以,无所谓。

选择一台配置好了的Hadoop客户端的机器(见Hadoop多用户的配置),作为客户机,以下操作均在这台客户机上进行。

2 下载Nutch源码
有两种方法,

去官网首页下载apache-nutch-1.7-src.tar.gz
用svn checkout
  1. $ svn co https://svn.apache.org/repos/asf/nutch/tags/release-1.7
复制代码



3 把Hadoop的6个配置文件拷贝到Nutch的conf/目录
将Hadoop的六个配置文件,拷贝到Nutch的conf/目录,相当于把Hadoop集群的配置信息告诉Nutch,

在伪分布式模式下,
  1. $ cd ~/local/opt/hadoop-1.2.1/conf
  2. $ cp hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml masters slaves /home/soulmachine/local/src/apache-nutch-1.7/conf
复制代码



在分布式模式下,
  1. $ ssh hadoop@localhost
  2. $ cd ~/local/opt/hadoop-1.2.1/conf
  3. $ scp hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml masters slaves soulmachine@localhost:~/local/src/apache-nutch-1.7/conf
  4. $ exit
复制代码



4 修改Nutch的配置文件
修改 conf/nutch-site.xml:
  1. <property>
  2.   <name>http.agent.name</name>
  3.   <value>My Nutch Spider</value>
  4. </property>
复制代码



修改 regex-urlfilter.txt, 见Nutch 快速入门(Nutch 1.7) 第4节,

#注释掉这一行
# skip URLs containing certain characters as probable queries, etc.
#-[?*!@=]
# accept anything else
#注释掉这行
#+.
+^http:\/\/movie\.douban\.com\/subject\/[0-9]+\/(\?.+)?$

5 重新编译Nutch
每次修改了$NUTCH_HOME/conf下的的文件,都需要重新编译Nutch,重新打包生成一个nutch-x.x.x.job文件,见这里,Running Nutch in (pseudo) distributed-mode。也可以打开build.xml看看里面的”runtime”这个task干了什么,就明白了。
  1. $ ant runtime
复制代码



这会在runtime/deploy下生成一个Job文件,apache-nutch-1.7.job,它本质上是一个zip压缩包,可以打开看一下它里面的内容。可以看到它包含了很多编译好的class文件,以及从conf/目录下的拷贝出来的xml配置文件。

6 向Hadoop集群提交Job,进行抓取
首先,要在con/hadoop-env.sh 添加HADOOP_CLASSPATH,让Hadoop知道去哪里找Nutch所依赖的jar包,

  1. export HADOOP_CLASSPATH=/home/soulmachine/local/opt/apache-nutch-1.7/runtime/local/lib/*.jar
复制代码

上传种子URL列表,

  1. $ hadoop fs -put ~/urls urls
  2. $ hadoop fs -lsr urls
复制代码


提交Job,

  1. $ hadoop jar ./runtime/deploy/apache-nutch-1.7.job org.apache.nutch.crawl.Crawl urls -dir TestCrawl -depth 1 -topN 5
复制代码


可以打开web页面监控job的进度,

  1. Jobtracer: http://master:50030
  2. Namenode: http://master:50070
复制代码


把Nutch运行在伪分布式Hadoop集群上,比Standalone模式要好,因为可以通过web页面监控job。

查看结果
  1. $ hadoop fs -ls TestCrawl
  2. Found 3 items
  3. drwxr-xr-x   - soulmachine supergroup          0 2014-02-04 02:17 /user/soulmachine/TestCrawl/crawldb
  4. drwxr-xr-x   - soulmachine supergroup          0 2014-02-04 02:18 /user/soulmachine/TestCrawl/linkdb
  5. drwxr-xr-x   - soulmachine supergroup          0 2014-02-04 02:16 /user/soulmachine/TestCrawl/segments
复制代码



7 注意
如果出现java.io.IOException: No valid local directories in property: mapred.local.dir的错误,说明你的客户机的mapred-site.xml是从hadoop集群拷贝过来的,没有修改过,mapred.local.dir是一个本地目录,集群上的机器有这个目录,但是你的本机上没有,所以出现了这个错误。解决办法是,在本地新建一个目录,然后把mapred.local.dir设置为这个路径。

如果出现org.apache.hadoop.security.AccessControlException: Permission denied: user=soulmachine, access=WRITE, inode="tmp"的错误,多半是因为你没有给这个用户创建hadoop.tmp.dir文件夹,见Hadoop多用户的配置第2.2节。

8 把Nutch 1.7 爬虫部署到Hadoop 2.x集群上
事实证明是完全可行的,Hadoop 2.x 向后兼容。

把hadoop 2.x的配置文件,全部拷贝到 nutch 的conf目录下

  1. cp ~/local/opt/hadoop-2.2.0/etc/hadoop* ~/local/src/apache-nutch-1.7/conf
复制代码


然后编译,

  1. ant runtime
复制代码


把种子列表上传到hdfs,

  1. $ hdfs dfs -put ~/urls urls
  2. $ hdfs dfs -lsr urls
复制代码


提交Job,

  1. $ hadoop jar ./runtime/deploy/apache-nutch-1.7.job org.apache.nutch.crawl.Crawl urls -dir TestCrawl -depth 2
复制代码

查看结果,

  1. $ cd runtime/deploy
  2. $ ./bin/readdb hdfs://localhost/user/soulmachine/TestCrawl/crawldb/ -stats
  3. 14/02/14 16:51:07 INFO crawl.CrawlDbReader: Statistics for CrawlDb: hdfs://localhost/user/soulmachine/TestCrawl/crawldb/
  4. 14/02/14 16:51:07 INFO crawl.CrawlDbReader: TOTAL urls:        70
  5. 14/02/14 16:51:07 INFO crawl.CrawlDbReader: retry 0:        70
  6. 14/02/14 16:51:07 INFO crawl.CrawlDbReader: min score:        0.006
  7. 14/02/14 16:51:07 INFO crawl.CrawlDbReader: avg score:        0.03972857
  8. 14/02/14 16:51:07 INFO crawl.CrawlDbReader: max score:        1.2
  9. 14/02/14 16:51:07 INFO crawl.CrawlDbReader: status 1 (db_unfetched):        59
  10. 14/02/14 16:51:07 INFO crawl.CrawlDbReader: status 2 (db_fetched):        11
  11. 14/02/14 16:51:07 INFO crawl.CrawlDbReader: CrawlDb statistics: done
复制代码





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

已有(3)人评论

跳转到指定楼层
tang 发表于 2015-6-19 21:26:12
回复

使用道具 举报

Jeelon 发表于 2016-5-27 09:23:22
谢谢分享心得!
大神,请问下在分布式模式下执行
[mw_shl_code=shell,true]$ hadoop jar ./runtime/deploy/apache-nutch-1.7.job org.apache.nutch.crawl.Crawl urls -dir TestCrawl -depth 2[/mw_shl_code]
和执行
[mw_shl_code=shell,true] ./runtime/deploy/bin/nutch crawl urls -dir data -depth 2[/mw_shl_code]
有区别吗?
回复

使用道具 举报

Jeelon 发表于 2016-6-2 17:30:28
完全按照你的 版本和集群方式 报错如下:
[mw_shl_code=shell,true]16/06/02 02:11:00 INFO client.RMProxy: Connecting to ResourceManager at CentOS641/192.168.159.120:8032
Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: file:/home/root/tmp/mapred/temp/inject-temp-2069906004, expected: hdfs://CentOS641:8020
        at org.apache.hadoop.fs.FileSystem.checkPath(FileSystem.java:642)
        at org.apache.hadoop.hdfs.DistributedFileSystem.getPathName(DistributedFileSystem.java:181)
        at org.apache.hadoop.hdfs.DistributedFileSystem.access$000(DistributedFileSystem.java:92)
        at org.apache.hadoop.hdfs.DistributedFileSystem$11.doCall(DistributedFileSystem.java:585)
        at org.apache.hadoop.hdfs.DistributedFileSystem$11.doCall(DistributedFileSystem.java:581)
        at org.apache.hadoop.fs.FileSystemLinkResolver.resolve(FileSystemLinkResolver.java:81)
        at org.apache.hadoop.hdfs.DistributedFileSystem.delete(DistributedFileSystem.java:581)
        at org.apache.nutch.crawl.Injector.inject(Injector.java:301)
        at org.apache.nutch.crawl.Crawl.run(Crawl.java:132)
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
        at org.apache.nutch.crawl.Crawl.main(Crawl.java:55)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:212)[/mw_shl_code]


请师兄帮忙看看啊?
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条