原文地址:http://cn.soulmachine.me/blog/20140204/

把Nutch爬虫部署到Hadoop集群上

Feb 4th, 2014 | Comments

软件版本:Nutch 1.7, Hadoop 1.2.1, CentOS 6.5, JDK 1.7

前面的3篇文章中,Nutch 快速入门(Nutch 1.7)Nutch
快速入门(Nutch 2.2.1)
在Eclipse里运行Nutch,Nutch都是跑在单机上,本文把Nutch部署到Hadoop集群上,在真正的分布式Hadoop集群上跑。

前提

1 启动Hadoop集群

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

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

2 下载Nutch源码

有两种方法,

  1. 去官网首页下载apache-nutch-1.7-src.tar.gz
  2. 用svn checkout

     $ svn co https://svn.apache.org/repos/asf/nutch/tags/release-1.7

3 把Hadoop的6个配置文件拷贝到Nutch的conf/目录

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

在伪分布式模式下,

$ cd ~/local/opt/hadoop-1.2.1/conf
$ cp hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml masters slaves /home/soulmachine/local/src/apache-nutch-1.7/conf

在分布式模式下,

$ ssh hadoop@localhost
$ cd ~/local/opt/hadoop-1.2.1/conf
$ scp hadoop-env.sh core-site.xml hdfs-site.xml mapred-site.xml masters slaves soulmachine@localhost:~/local/src/apache-nutch-1.7/conf
$ exit

4 修改Nutch的配置文件

修改 conf/nutch-site.xml:

<property>
<name>http.agent.name</name>
<value>My Nutch Spider</value>
</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干了什么,就明白了。

$ 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包,

export HADOOP_CLASSPATH=/home/soulmachine/local/opt/apache-nutch-1.7/runtime/local/lib/*.jar

上传种子URL列表,

$ hadoop fs -put ~/urls urls
$ hadoop fs -lsr urls

提交Job,

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

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

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

查看结果

$ hadoop fs -ls TestCrawl

Found 3 items
drwxr-xr-x - soulmachine supergroup 0 2014-02-04 02:17 /user/soulmachine/TestCrawl/crawldb
drwxr-xr-x - soulmachine supergroup 0 2014-02-04 02:18 /user/soulmachine/TestCrawl/linkdb
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目录下

cp ~/local/opt/hadoop-2.2.0/etc/hadoop* ~/local/src/apache-nutch-1.7/conf

然后编译,

ant runtime

把种子列表上传到hdfs,

$ hdfs dfs -put ~/urls urls
$ hdfs dfs -lsr urls

提交Job,

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

查看结果,

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

参考资料

  1. Web Crawling and Data Mining with Apache Nutch 的第3.2节
  2. Install Nutch 1.7 and Hadoop 1.2.0

  3. hadoop mapred(hive)执行目录 文件权限问题

废弃的资料

  1. Nutch and Hadoop Tutorial,讲的是Nutch 1.3的,太老了,完全不适用Nutch 1.7

  2. Running Nutch in (pseudo) distributed-mode,太短了,没什么内容

把Nutch爬虫部署到Hadoop集群上的更多相关文章

  1. [转载] 把Nutch爬虫部署到Hadoop集群上

    http://f.dataguru.cn/thread-240156-1-1.html 软件版本:Nutch 1.7, Hadoop 1.2.1, CentOS 6.5, JDK 1.7 前面的3篇文 ...

  2. 基于Docker一键部署大规模Hadoop集群及设计思路

    一.背景: 随着互联网的发展.互联网用户的增加,互联网中的数据也急剧膨胀.每天产生的数据量数以万计,本地文件系统和单机CPU已无法满足存储和计算要求.Hadoop分布式文件系统(HDFS)是海量数据存 ...

  3. 在Hadoop集群上的HBase配置

    之前,我们已经在hadoop集群上配置了Hive,今天我们来配置下Hbase. 一.准备工作 1.ZooKeeper下载地址:http://archive.apache.org/dist/zookee ...

  4. Hadoop集群上搭建Ranger

    There are two types of people in the world. I hate both of them. Hadoop集群上搭建Ranger 在搭建Ranger工程之前,需要完 ...

  5. Hadoop集群上使用JNI,调用资源文件

    hadoop是基于java的数据计算平台,引入第三方库,例如C语言实现的开发包将会大大增强数据分析的效率和能力. 通常在是用一些工具的时候都要用到一些配置文件.资源文件等.接下来,借一个例子来说明ha ...

  6. hadoop 把mapreduce任务从本地提交到hadoop集群上运行

    MapReduce任务有三种运行方式: 1.windows(linux)本地调试运行,需要本地hadoop环境支持 2.本地编译成jar包,手动发送到hadoop集群上用hadoop jar或者yar ...

  7. MapReduce编程入门实例之WordCount:分别在Eclipse和Hadoop集群上运行

    上一篇博文如何在Eclipse下搭建Hadoop开发环境,今天给大家介绍一下如何分别分别在Eclipse和Hadoop集群上运行我们的MapReduce程序! 1. 在Eclipse环境下运行MapR ...

  8. 在Hadoop集群上的Hive配置

    1. 系统环境Oracle VM VirtualBoxUbuntu 16.04Hadoop 2.7.4Java 1.8.0_111 hadoop集群master:192.168.19.128slave ...

  9. 在Hadoop集群上,搭建HBase集群

    (1)下载Hbase包,并解压:这里下载的是0.98.4版本,对应的hadoop-1.2.1集群 (2)覆盖相关的包:在这个版本里,Hbase刚好和Hadoop集群完美配合,不需要进行覆盖. 不过这里 ...

随机推荐

  1. Hadoop如何修改HDFS文件存储块大小

    一. 临时修改可以在执行上传文件命令时,显示地指定存储的块大小.1. 查看当前 HDFS文件块大小我这里查看HDFS上的TEST目录下的jdk-7u25-linux-x64.gz  文件存储块大小.1 ...

  2. jsonpath对json数据进行分析校验做接口测试

    在做接口测试的时候, 我们需要对返回的数据进行分析校验, 一般返回的都是json格式的数据, 怎么来解析校验呢? 之前有看过使用递归遍历json数据的, 然后找到了jsonpath, 可以很方便的对j ...

  3. 利用etcd及confd实现配置自动管理

    ETCD etcd 架设etcd集群 静态启动etcd集群需要每个成员在集群中知道另一个成员.在许多情况下,集群成员的IP可能提前未知.在这种情况下,可以使用etcd集群的自动发现服务.一旦etcd集 ...

  4. 使用JobControl控制MapReduce任务

    代码结构 BeanWritable:往数据库读写使用的bean ControlJobTest:JobControl任务控制 DBInputFormatApp:将关系型数据库的数据导入HDFS,其中包含 ...

  5. Entity Framework 学习笔记(一)之数据模型 数据库

    关于Entity Framework  数据模型 的开发有三种模式:1.引用数据库方式:2.在VS中新建EF空模型Model 方式:3.Code 方式 Entity Framework  数据模型   ...

  6. 解决微信浏览器video全屏的问题

    解决微信浏览器video全屏的问题 在微信浏览器里面使用video标签,会自动变成全屏,改成下面就好了,起码可以在video标签之上加入其他元素. <video id="videoID ...

  7. MySQL查询in操作 查询结果按in集合顺序显示

    偶尔看到的...或许有人会注意过,但我以前真不知道 SQL: select * from table where id IN (3,6,9,1,2,5,8,7); 这样的情况取出来后,其实,id还是按 ...

  8. CentOS安装wireshark

    yum install wireshark-gnome yum install libpcap

  9. 手把手编写PHP框架 深入了解MVC运行流程

    1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  10. wiredtiger存储引擎介绍——本质就是LSM,当然里面也可以包含btree和列存储

    见:http://www.slideshare.net/profyclub_ru/4-understanding-and-tuning-wired-tiger-the-new-high-perform ...