原文地址: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

    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节,

  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 重新编译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的进度,

把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

参考资料

  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. 培训笔记——Linux目录说明

    一般我们的电脑里都只有一块硬盘,但是这块硬盘怎么使用呢? 我们的头脑里大体有个分区的概念,为什么要分区呢? 不是很清楚,不过有句话说 不要把鸡蛋放在同一个篮子里,可能有这种考虑吧. 好,最起码知道分区 ...

  2. [原创]java WEB学习笔记14:JSP的9 个隐含对象 及 JSP 的基本语法

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  3. 《python基础教程(第二版)》学习笔记 函数(第6章)

    <python基础教程(第二版)>学习笔记 函数(第6章) 创建函数:def function_name(params):  block  return values 记录函数:def f ...

  4. LUM使用常规命令

    查看日志 tail -f /var/log/messages LUM使用常规命令再列出一下######------ 软件操作方法:* 关闭LUM及所有组件:lu-stop* 启动LUM及所有组件:lu ...

  5. 关于jvm中的常量池和String.intern()理解

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  6. Python- 列表内置方法

    列表,元组 查 索引(下标) ,都是从0开始 切片 .count 查某个元素的出现次数 .index 根据内容找其对应的位置 "haidilao ge" in a 增加 a.app ...

  7. angularjs 系列之$q和promise

    还是同一个项目,在项目中,发现多个controller之内有一个共同的服务器请求,当时只是不断的重复使用,如今,现在项目结束,代码开始走向了优化迭代的阶段: 首先,我的思路是把这个共同的请求,从con ...

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

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

  9. linux命令学习(8):mv命令

    版权声明更新:2017-05-12博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...

  10. javascript:function 函数声明和函数表达式 详解

    函数声明(缩写为FD)是这样一种函数: 有一个特定的名称 在源码中的位置:要么处于程序级(Program level),要么处于其它函数的主体(FunctionBody)中 在进入上下文阶段创建 影响 ...