原文地址: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. 常用grads函数

    GrADS的函数分两类, 一类是对格点/站点数据执行运算的,这一类我们姑且称之为分析函数; 另一类是脚本编程(gs)时使用的, 这后一类我们姑且称之为脚本函数. 第一类分析函数又分为格点分析和站点分析 ...

  2. 在我的电脑右键 Manage 拒绝访问的解决方法

    为什么我的电脑右键里的“管理”会变成“manage”啦.原来是中文的,点了之后出来一个对话框,标题是“桌面”说是“拒绝访问” 是系统环境变量里少了 windir=C:\WINDOWS 方法是:打开系统 ...

  3. 算法(Algorithms)第4版 练习 1.5.22

    package com.qiusongde; import edu.princeton.cs.algs4.StdOut; import edu.princeton.cs.algs4.StdStats; ...

  4. spring学习(5)

    bean配置 启用注解 <context:annotation-config/> 使用spring的特殊bean 对bean BeanPostProcessor spring本身提供的特殊 ...

  5. 循环递归+返回值(TreeView示例)

    示例:获取TreeView的所有Node,保存到List<TreeNode>,封装到通用工具类: 方法一:使用static方法.属性---调用前清空static类型的List public ...

  6. 机器学习(十九)— xgboost初试kaggle

     1.官网下载kaggle数据集Homesite Competition数据集,文件结构大致如下: 2.代码实战 #Parameter grid search with xgboost #featur ...

  7. 造成segmentation fault的可能原因分析

    一 造成segment fault,产生core dump的可能原因 1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串 ...

  8. 9 python 数据类型—字典

    字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...

  9. Java微信开发_03_使用测试号进行开发

    今天进行自定义菜单的开发时,发现公众号没有自定义菜单的权限.于是想到用测试号,但微信服务器如何区分你要请求的是公众号还是测试号呢. 我们可以发现不同公众号的appID和appsecre是不同的,一对a ...

  10. ADO:游标与RecordSetPtr

    一.游标的属性设置: 游标是记录集recordset中用于游动逐个查找一条记录的一种机制.查询的数据返回后,通过游标来逐条获取查询的记录. 因此在配置数据库查询方式前可配置游标的属性: rs.Curs ...