一个简单搜索引擎的搭建过程(Solr+Nutch+Hadoop)
最近,因为未来工作的需要,我尝试安装部署了分布式爬虫系统Nutch,并配置了伪分布式的Hadoop来存储爬取的网页结果,用solr来对爬下来的网页进行搜索。我主要通过参考网上的相关资料进行安装部署的。但网上的资料很多比较乱,我也走了一些弯路。下面将我的安装过程记录下来,供大家参考。不足之处,请大家批评指正。
环境:操作系统是Ubuntu10.04,jdk是openjdk-7-jdk。
一、安装nutch1.6
我曾直接下载部署nutch1.6的二进制文件,虽然可以成功爬取网页,但用solr来搜索下载好的网页时,总是无法成功。后来选择下载nutch1.6的源文件自己编译,则可以很好的和solr结合,完成搜索操作,并可以利用Hadoop平台来存储爬取的结果。以下是操作过程。
1、因为nutch的源代码是用svn来管理的,所以首先需要安装svn。如果机器中已经安装了svn,此步骤可以跳过。
sudo apt-get install subversion
2、将nutch的源代码从网上checkout。
svn co https://svn.apache.org/repos/asf/nutch/tags/release-1.6/ nutch
3、进入nutch文件夹下的conf文件夹,修改配置文件nutch-site.xml。在文件的<configuration>中加入下面内容
<property>
<name>http.agent.name</name>
<value>My nutch agent</value>
</property>
value值不能为空,否则会报错。
4、在nutch文件夹下,会发现有一个build.xml文件,它是ant的工作文件,用来编译、打包。我们在此目录中,用ant编译源程序。(若机器上没有安装ant,则通过命令:sudo apt-get install ant来安装)
直接输入命令:ant
第一次编译会耗费几分钟时间,因为需要下载该项目依赖的jar文件。以后再重新编译时,只需要十几秒就可以完成。编译、打包完后,会生成一个runtime文件夹。
6、进入到nutch目录下的runtime目录,会发现里面有两个文件夹:local、deploy。其中,local是用来直接爬取网页信息,存储在本地。而deploy是将爬取网页的任务提交给Hadoop,用MapReduce的方式来爬取网页信息,并将结果存储在HDFS上。下面会详细介绍如何使用它们。
二、基于Tomcat的solr的安装
1、安装solr
1)首先,执行以下命令,下载solr3.6.2
wget http://mirror.bjtu.edu.cn/apache/lucene/solr/3.6.2/apache-solr-3.6.2.tgz
2)将压缩文件解压后,进入到解压文件的example目录,复制nutch的conf目录中的schema.xml文件到[solr_home]/example/solr/conf目录。(注:[solr_home]为解压后的solr目录名称,其他以此类推)
3)修改配置文件solr/conf/solrconfig.xml,将里面所有的<strname="df">text</str>都替换为<strname="df">content</str>。
2、安装配置tomcat
1) 去apach的官网http://tomcat.apache.org,下载Tomcat的最新版本apache-tomcat-7.0.39。
2)将压缩文件解压后,拷贝[solr_home]/example/webapps/solr.war文件到[tomcat_home]/webapps目录下。
3)将[solr_home]/example/ 下的solr目录拷贝到[tomcat_home]下。
4)在tomcat目录下的conf/Catalina/localhost 目录中(如果没有则手工创建该目录)创建solr.xml文件,文件内容如下:
<Context docBase="[tomcat_home]/webapps/solr.war" debug="0" crossContext="true" >
<Environment name="solr/home" type="java.lang.String" value="[tomcat_home]/solr" override="true" />
</Context>
5)修改[tomcat_home]/conf下的server.xml文件,找到<Connector port="8080" … 项(假设tomcat监听8080端口),添加编码方式,修改后如下:
<Connector port="8080" URIEncoding="UTF-8"…
6)启动tomcat。然后在浏览器中输入http://localhost:8080/solr/,出现欢迎界面则表示配置成功。
3、爬取网页并建立索引,用solr来进行搜索。
1)进入到[nutch_home]/runtime/local/,新建文件夹,命名为urls。在urls目录中,新建一个名为url.txt的文档,在文档中输入一个或多个要爬取的网页地址并保存(如:http://www.qq.com)。
2)在目录[nutch_home]/runtime/local/下,输入如下爬取网页的命令:
bin/nutch crawl urls -dir data -threads 20 -depth 3 -topN 100
该命令的意思是:爬取存放在目录urls中的文件里的网页地址对应的网页信息,启动20个线程来完成任务,仅抓取网页上的超链接形成的树形结构中(起始网页为根),深度不超过3层的网页。最终仅保存结果中的前100条,保存在当前目录下的data文件夹中。
3)运行如下命令,将结果映射到solr中(Tomcat必须先启动)
bin/nutch solrindex http://127.0.0.1:8080/solr/ data/crawldb -linkdb data/linkdb data/segments/*
4)通过网页访问http://127.0.0.1:8080/solr/admin/,就可以在Query String栏中,输入要搜索的文字进行搜索了。
三、基于伪分布式Hadoop的爬虫系统
1、安装单机版的伪分布式Hadoop系统。
安装过程比较简单,网上有很多资料可以参考。我安装的版本是Hadoop1.0.4。
2、启动Hadoop的所有节点,将含有存放网页地址的文档的文件夹上传到HDFS上。
3、启动Tomcat。
4、进入到[nutch_home]/runtime/deploy/目录下,运行命令:
bin/nutch crawl /user/guangpeng/urls/ -solr http://127.0.0.1:8080/solr -dir crawl -depth 3 -topN 100 -threads 5
其中,/user/guangpeng/urls/为存放网页地址的文档在HDFS上的地址。
5、通过网页访问http://127.0.0.1:8080/solr/admin/,就可以在Query String栏中,输入要搜索的文字进行搜索了。
四、主要参考文档
http://wiki.apache.org/nutch/NutchTutorial
http://wiki.apache.org/solr/
http://yangshangchuan.iteye.com/blog/1837935
http://www.cnblogs.com/sirhuoshan/archive/2013/04/24/3040158.html
致谢
感谢小潘同学在百忙中帮我审阅稿件。