分享

Nutch-2.2.1系列之六Nutch与Solr的集成

tntzbzc 2014-11-17 21:24:51 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 39945
问题导读
1.Nutch1.x和2.x区别在什么地方?
2.如何修改Solr的配置文件使得Nutch爬取的网页可以被Solr索引查询?







Nutch以开箱的方式支持Solr,这极大的简化了Nutch与Solr的集成。Nutch也移除了遗留的对Tomcat运行旧的Nutch web应用程序和Apache Lucene索引的依赖。Nutch1.x和2.x关于Solr的区别在于1.x版本可以选择是否使用Solr索引,这需要一步一步地进行爬取工作,而2.x则提供了更为简洁的方式——crawl脚本,直接将爬取成功的页面与Solr集成在一起。当然通过阅读crawl脚本也可以将2.x中的一步到位方式分解为若干步骤,并且选择是否由Solr建立索引。在学习如何将Nutch与Solr结合在一起使用之前,先看一下Solr官网的介绍。

Solr是从apache的Lucene项目发展而来的流行的,非常快速的开源企业级搜索平台。主要特征包括强大的全文检索,分面搜索,近乎实时索引,动态集群,与数据库的集成,丰富的文档处理(比如word、PDF),还有地理空间搜索。Solr是高可靠、可扩展和容错的,提供分布式索引,复制和负载均衡查询,自动化的故障转移和恢复,集中管理等。Solr强化了很多世界上最大网站的搜索和导航特性。


Solr是用Java开发的,在一个诸如Jetty的servlet容器中以单机模式运行全文搜索服务。Solr使用Lucene的Java搜索库作为全文索引和搜索的核心,通过使用REST-like HTTP/XML andJSON APIs,使得几乎任何编程语言都可以很容易的使用Solr。使用者可以通过基于HTTP协议的XML,JSON,CSV 或者二进制将文档放在Solr中(称为索引),使用HTTP的GET方法查询并且收到XML,JSON,CSV 或者二进制结果。

根据官网的介绍,可以发现Solr提供了强大的关于索引的功能,并且几乎支持所有的编程语言,而不仅仅局限于JAVA。
现在开始将Nutch与Solr结合在一起。首先从官网下载Solr版本4.5.1版本,地址为http://lucene.apache.org/solr/,然后将下载的solr-4.5.1.tgz解压到相应的目录中,该目录在稍后将使用${SOLR_HOME}引用。进入${APACHE_SOLR_HOME}/example,执行java-jar
start.jar,等到solr启动完毕后,在浏览器中输入http://localhost:8983/solr/#/,进入如下图片所示的页面:





在该页面中可以发现solr的版本信息、系统信息、JVM信息等。点击左侧导航栏中的下拉选择框,选择collection1,进入下图所示的页面。在该页面中又出现了一些链接,可以点击进行相应的操作,比如进行查询。





在简单介绍了Solr的启动以及页面后,现在来看看如何修改Solr的配置文件使得Nutch爬取的网页可以被Solr索引查询。

首先备份${SOLR_HOME}/example/solr/conf/schema.xm文件,然后将Nutch目录中conf目录下的schema-solr4.xml复制到${SOLR_HOME}/example/solr/conf/中,并且重命名为schema.xm,若不修改则在启动Solr会报找不到schema.xm的错误而无法启动Solr。做完这些修改后运行java -jar start.jar重新启动Solr,然后运行bin/crawl urls sinahttp://localhost: 8983/solr 2进行网页的爬取并在Solr上建立索引。

在控制台中可以发现,当进行dedup作业时出现问题,该作业用于删除多余的副本确保被索引的urls的唯一性。如果有人也曾遇到过类似的问题,并成功的解决了,还请多多指教。该问题是在建立索引完成之后出现的,不会特别严重的影响查看索引结果,暂时略过,后续找到解决办法再更新文章。


  1. SOLR dedup -> http://localhost:8983/solr
  2. /home/hadoop/nutch-2.2.1/runtime/deploy/conf:/usr/java/jdk1.6.0_32/lib/tools.jar
  3. 13/12/20 20:23:28 INFO solr.SolrDeleteDuplicates: SolrDeleteDuplicates: starting...
  4. 13/12/20 20:23:28 INFO solr.SolrDeleteDuplicates: SolrDeleteDuplicates: Solr url: http://localhost:8983/solr
  5. 13/12/20 20:23:37 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
  6. 13/12/20 20:23:47 INFO mapred.JobClient: Running job: job_201312201956_0007
  7. 13/12/20 20:23:48 INFO mapred.JobClient:  map 0% reduce 0%
  8. 13/12/20 20:24:22 INFO mapred.JobClient: Task Id : attempt_201312201956_0007_m_000000_0, Status : FAILED
  9. java.lang.RuntimeException: java.lang.ClassNotFoundException: org.apache.nutch.indexer.solr.SolrDeleteDuplicates$SolrInputFormat
  10.         at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:857)
  11.         at org.apache.hadoop.mapreduce.JobContext.getInputFormatClass(JobContext.java:187)
  12.         at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:722)
  13.         at org.apache.hadoop.mapred.MapTask.run(MapTask.java:364)
  14.         at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
  15.         at java.security.AccessController.doPrivileged(Native Method)
  16.         at javax.security.auth.Subject.doAs(Subject.java:396)
  17.         at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1190)
  18.         at org.apache.hadoop.mapred.Child.main(Child.java:249)
  19. Caused by: java.lang.ClassNotFoundException: org.apache.nutch.indexer.solr.SolrDeleteDuplicates$SolrInputFormat
  20.         at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
  21.         at java.security.AccessController.doPrivileged(Native Method)
  22.         at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
  23.         at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
  24.         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
  25.         at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
  26.         at java.lang.Class.forName0(Native Method)
  27.         at java.lang.Class.forName(Class.java:247)
  28.         at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:810)
  29.         at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:855)
  30.         ... 8 more
复制代码


作业完成后进入Solr的管理页面,现在可以查询已经爬取到的网页了。在上图中点击query链接,出现下图所示的页面,在该页面中不做任何修改,点击下方的查询按钮,以JSON方式显示索引的内容。





可以修改q中的参数查询包含特定内容的网页,也可以选择wt中的选项定制以JSON、XML、CSV等格式显示网页内容,是可以在fl中以逗号分隔的方式定制需要显示哪些字段。在q中设置title:hadoop查询title中包含hadoop的网页,执行结果如下图所示:





上面只介绍了Solr的相当简单的一部分功能,更多更强大的功能还需要进一步学习探索,并且solrdedup作业失败的问题也需要继续研究其根源并解决。



相关文章推荐





Nutch-2.2.1系列之一Nutch简介||及jar包问题解决
http://www.aboutyun.com/thread-10048-1-1.html

Nutch-2.2.1系列之二编译部署Nutch及常见问题
http://www.aboutyun.com/thread-10049-1-1.html

Nutch-2.2.1系列之三Nutch配置文件||Nutch与Hbase结合使用时常见问题
http://www.aboutyun.com/thread-10050-1-1.html

Nutch-2.2.1系列之四Nutch抓取数据在HBase中的存储
http://www.aboutyun.com/thread-10051-1-1.html


Nutch-2.2.1学习之五以伪分布模式运行Nutch
http://www.aboutyun.com/thread-10078-1-1.html



Nutch-2.2.1系列之七过滤抓取数据
http://www.aboutyun.com/thread-10080-1-1.html

Nutch-2.2.1系列之八Nutch过滤URL实践
http://www.aboutyun.com/thread-10081-1-1.html

已有(3)人评论

跳转到指定楼层
aqi915 发表于 2015-9-2 09:38:28

solr5.2.1

本帖最后由 aqi915 于 2015-9-2 09:41 编辑

楼主好,那个dedup作业时解决了么,可以看看这个帖子:http://bbs.csdn.net/topics/390937892?page=1#post-400335137,好像是可以解决的,但是我用hadoop 2.7.1+nutch2.3+solr5.2.1 用了那个方法,报错的内容是变了:
Error: java.lang.NullPointerException
        at org.apache.hadoop.io.Text.encode(Text.java:450)
        at org.apache.hadoop.io.Text.set(Text.java:198)
        at org.apache.nutch.indexer.solr.SolrDeleteDuplicates$SolrRecordReader.nextKeyValue(SolrDeleteDuplicates.java:233)
        at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.nextKeyValue(MapTask.java:556)
        at org.apache.hadoop.mapreduce.task.MapContextImpl.nextKeyValue(MapContextImpl.java:80)
        at org.apache.hadoop.mapreduce.lib.map.WrappedMapper$Context.nextKeyValue(WrappedMapper.java:91)
        at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:145)
        at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:787)
        at org.apache.hadoop.mapred.MapTask.run(MapTask.java:341)
        at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:164)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.security.auth.Subject.doAs(Subject.java:415)
        at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657)
        at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)


有遇到这样的么?
回复

使用道具 举报

dead_lyn 发表于 2015-9-12 11:07:40
SOS~~~求问LZ,,,
在使用nutch后,爬取的都是一个一个的网页内容。。。
想问:后续的处理一般是怎么样的。
比如,想爬取一个网站的视频资源,如何下载下来呢。。。
谢谢啦!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条