1. 介绍
本文主要介绍 Linux 下 Nutch 的分布式配置与安装。 Nutch 是著名的开源搜索引擎,由 Nutch 引出了 Apache 另一个著名的项目 Hadoop ,一个类似于 Google 的 MapReduce 架构的高效分布式计算模型。我们基于本实验室已有的 Hadoop 平台,将 Nutch 部署在 Hadoop 之上,利用 MapReduce 进行并行的分布式抓取,将得到的索引文件存在 HDFS 上,使得 Nutch 可以更加高效的运行。本文主要参照了一下几个网页:
1. http://wiki.apache.org/nutch/NutchHadoopTutorial
2. http://www.cnblogs.com/wycg1984/archive/2010/06/25/1764926.html
另外,前面的几个网页都是基于 Nutch.0.9 或者 Nutch1.0 的,我们在安装中发现和我们已有的 Hadoop 平台 Hadoop-0.20.2 存在不兼容的问题。我们发现在 Nutch1.1 中已经支持 Hadoop-0.20.2 的版本,主要是在配置文件 conf 下的 hadoop-site.xml 分割成了 core-site.xml , hdfs-site.xml 和 mapred-site.xml 三个文件。以下是本文所使用的开源软件:
1. Nutch-1.1 ( 存放于 //202.38.64.184的 softs 目录下的 apache-nutch-1.1-bin)
2. Hadoop-0.20.2 (已安装)
3. Apache Tomcat 6.0.29 ( 存放于 //202.38.64.184的 softs 目录下的 apache-tomcat-6.0.29.tar )
2 . Hadoop 的安装
详见 //202.38.64.184/share/cluster-config/hadoop下的安装脚本 intall_in_lab_cluster.sh 。
以下是我们的 hadoop 环境:
用户名: hadoop
安装目录: /localshare/hadoop/install/hadoop
Master 节点:
Ip: 192.168.99.6 hostname: node-hp-dl-06
Slave 节点:
Ip: 192.168.99.9 hostname: node-hp-dp-09
Ip: 192.168.99.11 hostname: node-r630-1
Ip: 192.168.99.12 hostname: node-r630-2
安装目录下的配置文件夹 conf 用符号链接指向共享存储上的 /share/cluster-config/hadoop/conf 目录。
格式化 namenode 指令 ;
Bin/hadoop namenode –format
启动:
Bin/start-all.sh
关闭:
Bin/stop-all.sh
通过 Web 查看 hadoop 运行情况:
HDFS:
192.168.99.6:50070
MapReduce:
192.168.99.6:50030
3. Nutch 的安装
在已经安装 Hadoop 的情况下,只要将 Nutch 文件夹下的 conf 目录中文配置文件配置好,就可以通过 Nutch 中的 bin/start-all.sh 来启动 hadoop 进行分布式抓取和索引了。
首先,将 Nutch 的安装包 apache-nutch-1.1-bin 解压到 /localshare/nutch/install/nutch 目录下(之所以在 /localshare/nutch 目录下添加两层是为了方便多个 Nutch 版本切换而建立的符号链接)。
图 -1
将原安装包中的 conf 目录 mv 到 conf_bak 进行保存,在共享目录上建立共享配置文件夹 /share/cluster-config/nutch/conf ,把 conf_bak 中所有的文件 cp 到共享配置文件,并在原来 conf 的位置建立一个符号链接 conf 指向共享配置文件夹。
图 -2
Conf 文件夹下主要有以下几个文件:
图 -3
其中我们要修改的有:
1. Masters
2. Slaves
3. Hadoop-env.sh
4. Core-site.xml
5. Hdfs-site.xml
6. Mapred-site.xml
7. Nutch-site.xml
其中前 6 个配置文件只要和 hadoop 中 conf 下的同名配置文件保持一直就可以了。
1. Masters
192.168.99.6
2 . Slaves
192.168.99.9
192.168.99.11
192.168.99.12
3 . Hadoop-env.sh
这里主要是 jdk 等环境变量的配置。主要添加:
export JAVA_HOME=/localshare/jdk/java
export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS"
export HADOOP_SECONDARYNAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_SECONDARYNAMENODE_OPTS"
export HADOOP_DATANODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_DATANODE_OPTS"
export HADOOP_BALANCER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_BALANCER_OPTS"
export HADOOP_JOBTRACKER_OPTS="-Dcom.sun.management.jmxremote $HADOOP_JOBTRACKER_OPTS"
export HADOOP_HOME=/localshare/hadoop/install/hadoop
export JAVA_HOME=/localshare/jdk/java
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
export HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves
4. Core-site.xml
主要配置
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.99.6:9000</value>
</property>
</configuration>
5. Hdfs-site.xml
主要配置 hdfs 的属性,如目录,副本数量等。
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
6. Mapred-site.xml
主要配置 Mapreduce 的属性,如 jobtracker 的端口, map 数量, reduce 数量等。
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>192.168.99.6:9001</value>
</property>
</configuration>
7. Nutch-site.xml
主要配置 Nutch 相关属性,其中 http.agent.name 一定要配置,否则搜索结果始终为空。
<configuration>
<property>
<name>http.agent.name</name>
<value>nutch-1.1</value>
</property>
</configuration>
8. Crawl-urlfilter.txt
主要配置抓取文件的属性:
# accept hosts in MY.DOMAIN.NAME
# +^http://([a-z0-9]*/.)*MY.DOMAIN.NAME/
+^http://([a-z0-9]*/.)*ustc.edu.cn/
注释掉原来的 ^http://([a-z0-9]*/.)*MY.DOMAIN.NAME ,改为我们所要过滤的 domainname: ^http://([a-z0-9]*/.)*ustc.edu.cn/
至此, Nutch 的相关配置已经成功,主要在 /localshare/nutch/install/nutch 目录下启动服务即可:
执行 Bin/start-all.sh :启动 hadoop 。
利用 bin/hadoop dfs –ls 查看 HDFS 的情况。
接下来可以接使用 nutch 进行抓取了。
4 . Crawl 抓取
Nutch 爬虫命令是 :
bin/nutch Crawl <urlDir> [-dir d] [-threads n] [-depth i] [-topN N]
其中的 <urlDir> 参数是入口地址文件或其所在的目录,启动了集群进行分布式爬虫时,这个目录必须是 HDFS 中的目录,爬虫完毕将在 HDFS 中生成存有爬下来的数据的目录 [-dir d] 。
(1) 入口地址文件
在本地磁盘中新建一个文件,写入一个入口 url ,然后将其复制到 HDFS 中,使用如下命令 :
bin/hadoop dfs -copyFromLocal crawltest/urls urls
(2) 爬虫测试,在 namenode 、 datanode 或者与集群网络连通的安装有 Hadoop 或者 nutch 并且 hadoop-site.xml 配置相同的客户机上上均可使用如下命令分布式爬虫 :
bin/nutch crawl urls -dir crawled -depth 3 -topN 10
爬虫完毕, hdfs 中生成 crawled 目录 (user/hadoop/crawled) , crawled 目录下面有这些子目录: crawldb,index,indexes,linkdb,segments 。所有节点上的爬虫日志在 logs/hadoop.log 中。
从浏览器中可以查看到分布式爬虫时作业状态。
5 . Tomcat Configuration
Nutch 的爬虫和搜索可以说是分离的两块,爬虫可以是 M/R 作业,但搜索不是 M/R 作业。搜索有两种方式:一是将爬虫数据 ( 或者称索引数据 ) 放在本地硬盘,进行搜索。二是直接搜索 HDFS 中的爬虫数据。
Nutch 自带了一个 WEB 前端检索程序,即主目录下的 nutch-x.x.war ,实现 WEB 前端检索时需要安装 Tomcat ,执行应用程序。此外,在命令行中也可执行 Nutch 检索命令。
1. 单机检索
这里我们在 master ( 192.168.99.6 )上进行如下操作:
(1) 将 HDFS 中生成的存储爬虫数据的 data 目录复制到本地某一目录下。 ( 例如 /localshare/nutch/crawled)
bin/hadoop fs – copyToLocal data /localshare/nutch/crawled
(2) 安装 tomcat ,请确保安装路径没有空格,这很重要,否则将导致搜索结果始终为 0 。安装完后启动 tomcat 服务, bin/catalina start 。
(3) 将 Nutch 主目录下的 WEB 前端程序 nutch-1.1.war 复制到 ***/ tomcat/webapps/ 目录下。
(4) 浏览器中输入 http://192.168.99.6:8080/nutch-1.1 ,将自动解压 nutch-1.0.war ,在 webapps 下生成 nutch-1.1 目录。
(5) 配置 WEB 前端程序中的 nutch-site.xml 文件,该文件所在目录是 ***/tomcat/webapps/nutch-1.0/WEB-INF/classes/ 下,配置如下:
<configuration>
<property>
<name>http.agent.name</name>
<value>nutch-1.1</value>
</property>
<property>
<name>searcher.dir</name>
<value> /localshare/nutch/crawled </value>
</property>
</configuration>
(6) 重启 tomcat, 可以先执行 bin/catalina stop 停止再 start 。更改配置文件后必须重启 tomcat ,否则不会生效。
(7) 在 http://192.168.99.6:8080/nutch-1.1 下检索关键字
2. 分布式搜索
分布式爬虫时 Nutch 生成的索引数据存储的 HDFS 中, nutch 支持搜索 HDFS 中的数据。检索 HDFS 中的索引数据和检索本地种的索引数据的配置差别 是 hadoop-site.xml 文件。搜索 hdfs 中的数据时, nutch 在搜索的时候首先通过 rpc 检索 lucene 索引文件,然后定位到 segment 对应的 14 位数字时间作为文件夹的名字,然后从这个文件夹中获取结果信息的。
(1) 选择一台机器,该机器可以是 Hadoop 集群中的节点,也可以是集群之外的机器,但保证机器和 Hadoop 集群网络连通。(例如 192.168.99.6 )
(2) 安装 tomcat ,请确保安装路径没有空格,这很重要,否则将导致搜索结果始终为 0 。安装完后启动 tomcat 服务, bin/catalina start 。
(3) 将 Nutch 主目录下的 WEB 前端程序 nutch-1.1.war 复制到 ***/ tomcat/webapps/ 目录下。
(4) 浏览器中输入 http://192.168.99.6:8080/nutch-1.1 ,将自动解压 nutch-1.1.war ,在 webapps 下生成 nutch-1.1 目录。
(5) 配置 WEB 前端程序中的 core-site.xml 文件,该文件所在目录是 ***/tomcat/webapps/nutch-1.1/WEB-INF/classes/ 下。至少需要配置 fs.default.name 参数,指定 HDFS 文件系统 URI :
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.99.6:9000</value>
</property>
</configuration>
(6) 配置 WEB 前端程序中的 nutch-site.xml 文件,该文件所在目录是 ***/tomcat/webapps/nutch-1.0/WEB-INF/classes/ 下,配置如下:
<configuration>
<property>
<name>http.agent.name</name>
<value>nutch-1.1</value>
</property>
<property>
<name>searcher.dir</name>
<value>/user/hadoop/crawled</value>
</property>
</configuration>
(7) 重启 tomcat, 可以先执行 bin/catalina stop 停止,再 start 。更改配置文件后必须重启 tomcat ,否则不会生效。
(8) 在 http://192.168.99.6:8080/nutch-1.1 下检索关键字。
6 . Tomcat 中文问题
由于 tomcat 本身的问题,可能出现搜索中文关键字总是空结果的情况,这时需要修要 tomcat 的一个配置文件 ***tomcat/conf/server.xml :
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"
useBodyEncodingForURI="true" />
添加蓝色的部分。
7 . Jar 包运行方式
1-6 部已经详细叙述了在 hadoop 上部署 nutch 的全过程,此外,还可以通过 jar 包的方式来运行 nutch 任务。在 nutch 的安装目录下自带了一个文件 Nutch-1.1.job 。将这个文件拷贝到 hadoop 的安装目录下,并将 nutch/conf 下的配置文件都拷贝到 hadoop/conf 下(主要不要覆盖 hadoop 原来的配置文件),就可以像运行 hadoop 的 jar 包任务一样来运行 nutch :
Bin/hadoop jar nutch-1.1.job org.apache.nutch.crawl.Crawl urls -dir crawl -depth 1