Solr4.4 + hadoop2.0 + nutch1.8
先说一点nutch2.2.1不支持hadoop2.0而1.8是最新版本。如果想用nutch2.2.1需要做代码兼容要修改hadoop和nutch源码。
公司最近要做一个客户的数据分析。在原有的hadoop集群上进行分析。但是该公司的数据需要从固定网上爬取下来。所以就研究了下nutch。但是研究发现hadoop本身就是脱离于nutch,也就是说hadoop最开始时为nutch做爬虫的。然后我发现尝试使用solr4.8但是solr4.8要求jdk1.7,而且solr对jdk的依赖官网没有,只是说你下载了之后在doc里边有,告诉你依赖的jdk。所以我浪费了半天才搞明白4.8要jdk1.7果断放弃使用4.4
这里需要对hadoop命令有了解还要了解nutch和solr所以建议先单独研究下这3者。
首先搭建solr环境
这里使用的是solr4.4+tomcat6。建议使用6因为7有一个url不能解析’/’的bug当然可以解决,但是之前搭建4.8正恶心了就直接用6了。
1.解压缩后的solr文件下的example下的solr拷贝到一个单独目录(这里拷贝到/opt下)作为tomcat的示例。将解压缩文件夹下的dist的solr-version.war包拷贝到tomcat/webapps下改名为solr.war
2.进入tomcat/conf/Catalina/localhost/下创建solr.xml(如果没有此目录就启动一下tomcat)在solr.xml里添加如下内容
<Context docBase="$TOMCAT_HOME/webapps/solr.war" debug="0" crossContext="true" >
<Environment name="solr/home" type="java.lang.String" value="/opt/solr" override="true" />
</Context>
3.将example下的lib/ext下所有jar包拷贝到tomcat/lib下,然后example下resource下log4j.properties拷贝到tomcat/lib下。
4.如果你要添加中文分词器。IK Analyzer 2012FF_hf1将解压缩后的IKAnalyzer.cfg.xml,IKAnalyzer2012FF_u1.jar,stopword.dic拷贝到你webapps的solr文件夹WEB-INFO/lib下(已经启动之后deploye了solr.war以后)然后在/opt/solr/collection1/conf下的schema.xml中的<types><types>下添加如下内容:
<fieldType name="text_tr" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.TurkishLowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="false" words="lang/stopwords_tr.txt" />
<filter class="solr.SnowballPorterFilterFactory" language="Turkish"/>
</analyzer>
</fieldType>
启动tomcat服务器访问http://ip:port/solr即可。
Ps:下边整合nutch的时候有可能会出现如下错误:
] ERROR org.apache.solr.core.SolrCore ? org.apache.solr.common.SolrException: ERROR: [doc=http://www.36kr.com/] unknown field 'host'
解决办法:这个问题参考
http://stackoverflow.com/questions/13429481/error-while-indexing-in-solr-data-crawled-by-nutch
还是是在schema.xml文件中在<field>…</fields>中增加以下的字段:
<fields> <field name="host" type="string" stored="false" indexed="true"/>
<field name="digest" type="string" stored="true" indexed="false"/>
<field name="segment" type="string" stored="true" indexed="false"/>
<field name="boost" type="float" stored="true" indexed="false"/>
<field name="tstamp" type="date" stored="true" indexed="false"/>
<field name="anchor" type="string" stored="true" indexed="true"
multiValued="true"/>
<field name="cache" type="string" stored="true" indexed="false"/>
</fields>
整合nutch
下载好的jar包解压缩先在本地测试。
1首先:在nutch加压缩目录创建urls目录,进入urls目录,创建seed.txt,在txt内添加你要爬的网址:http://www.163.com
2.进入conf下编辑regex-urlfilter.txt,在最后一行修改+.为正则表达式。也可不修改
+^http://([a-z0-9]*\.)*www.163.com/
3.编辑conf下nutch-site.xml文件加入如下内容:这个是必须加的
<property>
<name>http.agent.name</name>
<value>My Nutch Spider</value>
</property>
4.可以测试了。bin/crawl urls localDir http://ip:port/solr 2
如果出现如下错误
Exception in thread "main" java.io.IOException: Job failed!
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1357)
at org.apache.nutch.indexer.IndexingJob.index(IndexingJob.java:123)
at org.apache.nutch.indexer.IndexingJob.index(IndexingJob.java:81)
at org.apache.nutch.indexer.IndexingJob.index(IndexingJob.java:65)
at org.apache.nutch.crawl.Crawl.run(Crawl.java:155)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.nutch.crawl.Crawl.main(Crawl.java:55)
解决办法:
进到nutch/conf下,编辑nutch-default.xml找到plugins.folders这个修改成绝对路径即可。
整合hadoop
搭建hadoop集群就不说了
首先下载nutch的src压缩包不是bin压缩包,在解压缩目录里边执行ant(这个不解释了)
因为第一次编译所以会很慢。编译完成以后在解压缩目录下出现runtime目录,进取有deploy和local两个文件夹,depoly就是在分布式hadoop中使用的。
进入deploy,创建urls目录,进入urls目录,创建seed.txt,在txt内添加你要爬的网址:http://www.163.com,将urls文件夹put到hdfs下。然后在hdfs下创建一个输出目录crawld
。然后执行如下命令:
Bin/crawl urls crawld http://ip:port/solr 2
哈哈。你就考到mapreduce程序运行的日志了。但是最后会出现非法输入路径crawld/segments/crawl_****原因不太清楚。解决办法就是
进到bin文件目录执行./crawl urls crawld http://ip:port/solr 2
然后访问http://ip:port/solr访问solr测试。