Nutch安装配置问题和解决

file

Nutch 1.x

按官方文档NutchTutorial安装Nutch 1.11

下载的.tar.gz解压到/usr/share目录下。

Solr 4.x

nutch 1.x支持solr 4.x(来源),官方教程也是对应solr 4.x的,所以先下载solr 4.10.4来用。

注1:NutchTutorial里有几处对schema.xml文件的修改(EnglishPorterFilterFactory等等),在nutch 1.11里已经改好了,不再需要。

注2:NutchTutorial最后部分bin/nutch solrindex命令的最后一个参数crawl/segments/,经试验应为crawl/segments/*,否则会提示找不到文件错误。

启动solr内置的jetty服务器,命令:

java -jar start.jar

然后在浏览器里访问下面的地址即可管理solr:

http://localhost:8983/solr/

在浏览器里可以使用下面的链接执行查询(即solr API):

http://localhost:8983/solr/collection1/select?q=mykeyword&wt=xml&indent=true

注:如果Solr用5.4版本的,启动命令是(Nutch的文档里example/start.jar是5.2以前的solr启动方式):

bin/solr start -e cloud -noprompt

Nutch2与Solr5的集成方式在官方文档里没有详细描述,solr5的目录结构与solr4不一样(没有collection1),以下文章可参考:文章1

mmseg4j

为支持中文分词,我们使用mmseg4j项目。

从github上的mmseg4j主页下载2.3.0版本,解压后得到两个.jar文件,放在 /usr/share/solr-4.10.4/example/solr-webapp/webapp/WEB-INF/lib/ 目录下,并在schema.xml里加入mmseg4j的field types。

参考1

注意:要特别注意mmseg4j与solr的版本匹配,在mmseg4j的下载包里有说明,针对solr 4.9和4.10要使用mmseg4j的2.2.0版本。如果使用了mmseg4j 2.3.0版,分词时会提示java.lang.RuntimeException: java.lang.AbstractMethodError异常。

Nutch 2.x

首先是官方文档,实在是太简略了点,这篇文章一起参考一下。

按官方文档进行到ant runtime命令时有两个问题:1)需要等比较久且一开始的几分钟内没有进度;2)可能会警告找不到tools.jar文件,只要yum安装java-1.7.0-openjdk-devel即可(注意不要用java 1.6,版本过低会导致编译失败),JAVA_HOME环境变量在/etc/profile里指定,执行source /etc/profile以便不重启生效。

进行到bin/nutch inject urls这一步时可能会报一些找不到类异常或VerifyError错误,一般是由于nutch与hbase里一些jar包版本不一致造成的,解决方法是用hbase里的jar代替nutch里的相应jar包。主要是$hbase_home$/lib目录下的hbase*.jar、hadoop*.jar、htrace*.jar和protobuf*.jar,复制到$nutch_home$/runtime/local/lib目录下,注意先移除旧的jar包。

遇到一个不好解决的问题:ava.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.TaskAttemptContext, but class was expected。仔细又看了官方文档,与Nutch2配套的hbase建议是hbase-hadoop(没写hadoop1或hadoop2,原来是指hadoop1,虽然hbase的quickstart里说大部分情况用hadoop2:“in most cases, you should choose the file for Hadoop 2”),之前我是按hadoop2下载的,改为hadoop1环境即可。

改为hadoop1后,nutch inject可以正常执行了,但nutch generate时遇到java.lang.NoSuchMethodError: org.apache.hadoop.hbase.HRegionLocation.getServerAddress()异常。问题应该是gora-hbase版本,在ivy.xml里改为0.6.1,重新ant runtime,发现build出来的hbase相关的jar包自动都升级为0.98了(之前ivy.xml里是0.5,对应0.94),而且包文件名都带hadoop2!然后inject时又报java.lang.IncompatibleClassChangeError: Found interface org.apache.hadoop.mapreduce.Counter, but class was expected异常(在hadoop.log里看)。

待参考:http://www.cnblogs.com/mactech/p/4229708.html http://stackoverflow.com/questions/26236112/hadoop-2-5-1-nutch-2-2-1-found-interface-org-apache-hadoop-mapreduce-taskatte

再次查看官方文档,发现其中的nutch2下载链接有变化(也许是我记错了),以前我下载的是nutch 2.3,现在指向的是nutch 2.3.1。下载2.3.1后查看ivy.xml发现gora版本是0.6.1(nutch 2.3时对应gora 0.5),且hadoop对应2.5.2(nutch 2.3时对应hadoop 1.2.0)。重新用nutch 2.3.1按官方文档,配合hbase-0.98.8-hadoop2,所有问题解决。

solr5引入了configset的概念,所以schema.xml文件的位置与solr4有所不同。

nutch-site.xml配置文件说明:见此链接

nutch2.3.1使用crawl命令时提示“No IndexWriters activated - check your configuration”错误,解决方法是在nutch-site.xml里添加plugin.includes属性,详见此链接

nutch2.3.1里solrindex被index取代,指定solr地址改为-D solr.server.url=xxx,例如bin/nutch index -D solr.server.url=http://localhost:8983/solr 1453805148-685784700 -crawlId crawl2

nutch2.3.1的parse步骤提示“http://news.sina.com.cn/ skipped. Content of size 130163 was truncated to 65536”,在nutch-site.xml里设置http.content.limit为-1。(nutch-default.xml里可以看到所有可设置的项)

nutch2.3.1的updatedb步骤耗时过长:查看logs/hadoop.log发现无法连接到hbase在一直重试,不知道什么原因hbase停止了,$HBASE_HOME$/bin/start-hbase后updatedb继续完成。

nutch2.3.1的fetch步骤控制台里显示“... 500 URLs in 2 queues”,实际队列里的url数量超过500但无法显示,原因见这个链接

注意:两个配置文件regex-normalize.xml和regex-urlfilter.xml起作用是有先后的,normalize在前,所以filter时用来匹配的url是经过normalize的。例如http://my.website.com/product/38392/?from=mobile这样一个url,在normalize步骤有可能已经变成了http://my.website.com/product/38392/。这两个配置文件里使用的正则表达式遵守Perl5语法

seed.txt里的url可以用"#"注释

删除solr里已索引的文档:

curl http://localhost:8983/solr/collection1/update --data-binary "<delete><query>\*</query></delete>" -H 'Content-type:text/xml; charset=utf-8'
curl http://localhost:8983/solr/collection1/update --data-binary "<commit/>" -H 'Content-type:text/xml; charset=utf-8'

使用bin/crawl脚本抓取时,发现regex-urlfilter.txt没起作用,原因是bin/crawl脚本里的generate命令加了-noFilter参数,去掉后解决。 

通过solr-index命令导入solr的文档,tstamp字段值都是"1970-01-01T00:00:00Z"。根据nutch用户组里的讨论,tstamp字段应该是抓取网页的时间,不应该为空(1970)。但检查了solrindex-mapping.xml文件,里面tstamp字段的stored参数值已经是true。暂时的解决方案,在nutch-site.xml的plugin.includes里添加index-more插件,这样在solr索引的每个文档里会多出date、contentLength等若干个新字段,其中date字段可用于表示文档的抓取时间。

Nutch常用参数

1、同一服务器两次抓取间隔:nutch-site.xml里fetcher.server.delay

2、只抓取站内链接:nutch-site.xml里db.ignore.external.links

3、从页面里最多解析出多少个链接:nutch-site.xml里db.max.outlinks.per.page 

Hbase

常用命令

由于磁盘空间占满,扩容后hbase无法正常启动。查看$hbase_home$/logs/后发现ERROR master.HMasterCommandLine: Master exiting / java.io.EOFException at ...readInt,看起来像是zookeeper在读取数据文件时报的错误,可能是之前的非正常停止导致数据文件损坏,于是在$hbase_home$/conf/hbase-site.xml配置文件里将hbase.zookeeper.property.dataDir指向另一个新建的目录,再start-hbase恢复正常。

有用链接:HBase集群安装过程中的问题集锦

Nutch集群

在name节点上

首先配置hadoop,主要参考Hadoop: Setting up a Single Node Cluster,按Pseudo-Distributed Operation配置。

1.下载hadoop-2.7.2/hadoop-2.7.2.tar.gz并解压缩到/usr/share/目录下

2.编辑/etc/profile文件,在结尾处添加export $HADOOP_HOME=/usr/share/hadoop-2.7.2和export PATH=$PATH:$HADOOP_HOME/bin这两句,以便nutch脚本可以找到并执行hadoop。

3.编辑$HADOOP_HOME/etc/hadoop/hadoop-env.sh,将JAVA_HOME指到java安装目录(即使在/etc/profile里已经有JAVA_HOME,这一步也不能省略)

4.通过访问http://localhost:50070/可看到dfs信息

5.设置hbase-site.xml让hbase使用hdfs:

<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>
<property>
  <name>hbase.rootdir</name>
  <value>hdfs://cluster1:9000/hbase</value>
</property>

如果启动hbase时提示找不到JAVA_HOME,修改hbase-env.sh脚本。

6.修改yarn-site.xml:

<property>
    <name>yarn.resourcemanager.hostname</name>
    <value>cluster1</value>
</property>
<property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce\_shuffle</value>
</property> 

在data节点上:

1.安装hadoop,步骤和name节点上相同。

2.将name节点的authorized_keys文件scp到data节点,确保name节点可以不用密码ssh到data节点

3.将name节点的几个配置文件复制到data节点相同目录下:

scp /usr/share/hadoop-2.7.2/etc/hadoop/core-site.xml root@cluster2:/usr/share/hadoop-2.7.2/etc/hadoop/core-site.xml
scp /usr/share/hadoop-2.7.2/etc/hadoop/hdfs-site.xml root@cluster2:/usr/share/hadoop-2.7.2/etc/hadoop/hdfs-site.xml
scp /usr/share/hadoop-2.7.2/etc/hadoop/mapred-site.xml root@cluster2:/usr/share/hadoop-2.7.2/etc/hadoop/mapred-site.xml
scp /usr/share/hadoop-2.7.2/etc/hadoop/yarn-site.xml root@cluster2:/usr/share/hadoop-2.7.2/etc/hadoop/yarn-site.xml

4.在name节点的/etc/hosts里添加data节点的ip,例如“10.0.0.2 cluster2”,否则data节点可能会无法连接到name节点(“Datanode denied communication with namenode because hostname cannot be resolved”)

5.在name节点的$HADOOP_HOME/etc/hadoop/slaves里添加data节点的ip地址

6.(如果执行job时提示找不到HBaseConfiguration等异常,说明.job文件里缺少相应的jar包),用下面的方法重新打包:

cd runtime/deploy
unzip -d apache-nutch-2.3.1 apache-nutch-2.3.1.job 
rm  apache-nutch-2.3.1.job 
cd apache-nutch-2.3.1 
rm lib/hbase-\*\*\*.jar 
cp /usr/share/hbase-0.98.8-hadoop2/lib/hbase-common-0.98.8-hadoop2.jar lib/ 
cp /usr/share/hbase-0.98.8-hadoop2/lib/hbase-client-0.98.8-hadoop2.jar lib/
cp /usr/share/hbase-0.98.8-hadoop2/lib/hbase-protocal-0.98.8-hadoop2.jar lib/
zip -r ../apache-nutch-2.3.1.job ./\* 
cd .. 
rm -r apache-nutch-2.3.1

补充:还要修改deploy里nutch-site.xml、hbase-site.xml,并打到.job包里。 

7.在hdfs上创建种子列表目录

hdfs dfs -mkdir /urls
hdfs dfs -put seed.txt /urls

参考:

Nutch and Hadoop Tutorial

Running Nutch in (pseudo) distributed-mode (Nutch1.x)

INSTALL HADOOP+HBASE+NUTCH+ELASTICSEARCH

验证hadoop

hadoop自带了一些示例应用,可以用于验证hadoop集群是否正常,以wordcount为例:

hdfs dfs -mkdir /wordcount
hdfs dfs -mkdir /wordcount/input

#编辑一个本地文件test.txt并输入一些单词或短语,例如hello word,每个占一行
vi test.txt
#输入内容(略)
hdfs dfs put test.txt /wordcount/input

#/wordcount/output目录必须“不存在”,否则会报错
hadoop jar $HADOOP\_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.2.jar wordcount /wordcount/input/\* /wordcount/output

#查看hdfs上生成的结果
hdfs dfs -ls /wordcount/output
hdfs dfs -cat /wordcount/output/part-r-00000

另:集群里每台机器的hostname最好与/etc/hosts文件里所用的保持一致。

遇到的问题:

1、org.apache.zookeeper.ClientCnxn: Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)

解决:查看datanode上的$HADOOP_HOME$/etc/hadoop/logs/yarn-root-nodemanager-xxx.log文件,发现org.apache.hadoop.ipc.Client: Retrying connect to server: 0.0.0.0/0.0.0.0:8031的错误信息。参考这个帖子,在datanode的yarn-site.xml里添加了yarn.resourcemanager.hostname属性,0.0.0.0异常消失,但无法连接到2181端口问题依旧。后检查发现master上的hbase-site.xml有两个,其中一个在/usr/share/hbase-xxx目录下,另一个在nutch/runtime/deploy里,前者里没有配置hbase.zookeeper.quorum属性,添加后重启hbase问题解决(另外还添加了一个hbase.master属性值为master:60000)。

Nutch二次开发

网站内容抽取

可采用boilerpipe,一个开源的基于训练的内容抽取库。或采用针对每个网站分别定制的方案,参考链接1

支持js加载

考虑phantomjsselenium

自定义如何Parse所抓取到的网页

使用ParsingFilter和IndexingFilter,参考链接

Solr查询

Solr的查询语法很丰富,通过组合各种参数可以达到多种查询目标,官方文档可通过这个链接下载(pdf格式):Apache Solr Reference Guide

限定在指定日期范围内的文档里搜索:fq=date:[2016-02-15T00:00:00Z TO 2016-02-15T23:59:59Z]

要进行分组统计,使用facet参数,例如统计最近30天内指定关键词出现次数(注意:网上有些资料使用facet.date,这个参数已经在solr 3.1以后deprecated了,用facet.range替换):facet=true&facet.range=date&facet.range.start=NOW/DAY-31DAY&facet.range.end=NOW/DAY&facet.range.gap=%2B1DAY (%2B是URL encode后的加号)

其他爬虫工具

WebCollector

Heritrix3

(本文原始链接:https://www.cnblogs.com/bjzhanghao/p/5104653.html