文章图片标题

在centos搭建网络爬虫与搜索引擎环境nutch2.3.1+mysql5.5/hadoop与hbase+solr4.6最佳实践

分类:大数据, 网站建设 作者:阳光倾城 评论:0 点击: 717 次 日期:2016-08-29

nutch是Apache组织研发的一款开源的搜索引擎项目(网络爬虫),纯java实现,它提供了构建一个搜索引擎所需要的全部工具和功能。使用Nutch不仅可以建立自己内部网的搜索引擎,同时也可以针对整个网络建立搜索引擎。除了基本的功能之外,Nutch也还有不少自己的特色,如支持Hadoop框架执行真正大数据处理等。

开源算法更加透明, 排名结果更值得大家信赖,使用nutch可以做到:

* 每个月取几十亿网页

* 为这些网页维护一个索引

* 对索引文件进行每秒上千次的搜索

* 提供高质量的搜索结果

Nutch的总体结构

Nutch从总体上看来,分为三个主要的部分:爬行、索引和搜索,各部分之间的关系如图1所示。Web db是Nutch初始运行的URL集合;Fetcher是用来抓取网页的爬行器,也就是平时常说的Crawler;indexer是用来建立索引的部分,它将会生成的索引文件并存放在系统之中;searcher是查询器,用来完成对某一词条的搜索并返回结果。

图 1. Nutch 总体结构

image

Nutch 的运行流程

在了解了 Nutch 的总体结构之后,再详细的看看 Nutch 具体是如何运行的?Nutch 的运行流程如图2所示。

1. 将起始 URL 集合注入到 Nutch 系统之中。

2. 生成片段文件,其中包含了将要抓取的 URL 地址。

3. 根据URL地址在互联网上抓取相应的内容。

4. 解析所抓取到的网页,并分析其中的文本和数据。

5. 根据新抓取的网页中的URL集合来更新起始URL集合,并再次进行抓取。

6. 同时,对抓取到的网页内容建立索引,生成索引文件存放在系统之中。

图 2. Nutch 的运行流程

image

安装nutch2.3.1,先安装ant:

image

image

配置ant:

执行vi /etc/profile

image

使环境变量生效:

image

剔除多余的openjdk:

image

image

前面使用yum安装的ant版本太老,删除之:

image

安装1.9.7 ant:

image

添加执行权限,并检查是否安装成功:

image

 

下面开始配置和编译nutch2.3:

ftp上传到指定目录,然后配置NUTCH_HOME

image

image

配置mysql支持:[root@imagehost apache-nutch-2.3.1]# vi ivy/ivy.xml

image

条目1原来对应的是0.6.1,为了使用sql统计必须退回0.2.1(对于个人用户来说,mysql足够了,hbase什么的不是个人能负担的起的)。

配置数据库连接:

[root@imagehost apache-nutch-2.3.1]# vi conf/gora.properties

image

 

修改ddl映射配置

[root@imagehost conf]# vi gora-sql-mapping.xml

image

 

修改nutch-site.xml

添加蜘蛛名称:

image

为了防止网页的反爬虫机制,可以设置名称为某个浏览器的useragent:

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:48.0) Gecko/20100101 Firefox/48.0

找到并添加内容:

image

image

image

防止爬去网页时报错,添加如下:

image

 

配置完毕,开始编译nutch:

image

出现上面的错误,需要加入jar:

下载sonar-ant-task-2.2.jar,将其拷贝到nutch2.3/lib 目录下面

修改build.xml,引入上面添加的jar包:
<!-- Define the Sonar task if this hasn't been done in a common script -->
<taskdef uri="antlib:org.sonar.ant" resource="org/sonar/ant/antlib.xml">
    <classpath path="${ant.library.dir}" />
    <classpath path="${mysql.library.dir}" />
    <classpath><fileset dir="./lib/" includes="sonar*.jar" /></classpath>
</taskdef>

image

漫长的等待。。。(如果长时间没反应,就kill掉重新来过)

直接执行ant,,等待几分钟后激动人心的:

image

image

终于成功了:

image

验证安装成功:

cd ${NUTCH_HOME}/runtime/local

image

 

nutch命令对应的java类:

inject=org.apache.nutch.crawl.InjectorJob
hostinject=org.apache.nutch.host.HostInjectorJob
generate=org.apache.nutch.crawl.GeneratorJob
fetch=org.apache.nutch.fetcher.FetcherJob
parse=org.apache.nutch.parse.ParserJob
updatedb=org.apache.nutch.crawl.DbUpdaterJob
updatehostdb=org.apache.nutch.host.HostDbUpdateJob
readdb=org.apache.nutch.crawl.WebTableReader
readhostdb=org.apache.nutch.host.HostDbReader
elasticindex=org.apache.nutch.indexer.elastic.ElasticIndexerJob
solrindex="org.apache.nutch.indexer.IndexingJob -D solr.server.url=$1"
index=org.apache.nutch.indexer.IndexingJob
solrdedup=org.apache.nutch.indexer.solr.SolrDeleteDuplicates
solrclean="org.apache.nutch.indexer.CleaningJob -D solr.server.url=$2 $1"
clean=org.apache.nutch.indexer.CleaningJob
parsechecker=org.apache.nutch.parse.ParserChecker
indexchecker=org.apache.nutch.indexer.IndexingFiltersChecker
plugin=org.apache.nutch.plugin.PluginRepository
webapp=org.apache.nutch.webui.NutchUiServer
nutchserver=org.apache.nutch.api.NutchServer
junit=org.junit.runner.JUnitCore

 

对于nutch中文乱码的处理:conf/gora.properties:注意所有配置文件必须另存为utf8格式,否则后面有空格

gora.sqlstore.jdbc.driver=com.mysql.jdbc.Driver

gora.sqlstore.jdbc.url=jdbc:mysql://localhost:3306/nutch? useUnicode=true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=convertToNull

gora.sqlstore.jdbc.user=devuser

gora.sqlstore.jdbc.password=devuser

 

webpage字段的含义:

id
主键,根据网页url生成(格式:reversed domain name:protocol:port and path),因此,Nutch2只能保存当前网页的状态,而不能保存历史信息。
headers
标准的http headers ,其中包含非打印字符。Last-Modified 等信息可能于判断网页是否需要更新(仅需发一个head请求,而不是下载整个网页)
text
合并了解析出来的所有文本字段(utf-8),用于普通的检索,不过现在检索一般使用solr,所以这个字段意义不大。
status
记录抓取状态
1 unfetched
(links not yet fetched due to limits set in regex-urlfilter.txt, -TopN crawl parameters, etc.) 

(由于regex-urlfilter.txt,-TopN参数的限制等原因,尚未提取)

2 fetched (page was successfully fetched) (页面成功提取)
3 gone (that page no longer exists) (该网页已不存在)
4 redir_temp (temporary redirection — see reprUrl below for more details) (临时重定向)
5 redir_perm (permanent redirection — see reprUrl below for more details) (永久重定向)
34 retry (重试)
38 not modified (没有修改)
markers
各个任务的标记(如:dist***injmrk_***updmrk_***ftcmrk_***gnmrk_***prsmrk_**)
parseStatus
parse状态,在执行parseJob之前都是NULL。 ParseStatusCodes.html
modifiedTime
最后更改时间
score
网页重要程度(PR),Nutch2.2.1 使用的是OPIC算法
typ
类型(如application/xhtml+xml)
batchId
批次ID,由generate生成( (curTime/1000) + "-" +randomSeed ), fetch时可选择特定batchId的任务
baseUrl
用于将网页源码中相对链接地址的转为绝对地址,通常就是当前网页的地址,有重定向的情况下,是最终定向到的地址
content
完整的网页源码,未经任何处理(字符集也没转)。 
title
title标签里的内容 (已转utf-8编码)
reprUrl
重定向url,将在下一轮抓取,不会立即跟入
fetchInterval
抓取间隔,默认是2592000(30天)
prevFetchTime
上次抓取时间
inlinks
入链(url+linktext)
prevSignature
上次更新时网页签名
outlinks
出链(url+linktext)
fetchTime
下次抓取时间,通常是间隔一个月
retriesSinceFetch
重试次数
protocolStatus
ACCESS_DENIED 17 
BLOCKED 23 
EXCEPTION 16 
FAILED 2 
GONE 11 
MOVED 12 
NOTFETCHING 20 
NOTFOUND 14 
NOTMODIFIED 21 
PROTO_NOT_FOUND 10 
REDIR_EXCEEDED 19 
RETRY 15 
ROBOTS_DENIED 18 
SUCCESS 1 
TEMP_MOVED 13 
WOULDBLOCK 22
signature
网页签名,用于判断网页是否改变,默认的实现是:org.apache.nutch.crawl.MD5Signature ,采用content的MD5值,另一个方案是org.apache.nutch.crawl.TextProfileSignature,content抽取文本、分词、排序等一系列操作后计算MD5值 TextProfileSignature
metadata
自定义元数据,可以在种子文件里面加,例如: http://xxxx/xxx.html \t type=news

 

下载solr4.6:wget http://archive.apache.org/dist/lucene/solr/4.6.1/solr-4.6.1.tgz

解压到指定目录,设定solrhome=/usr/local/solr-4.6.1/example

NUTCH_DIR/conf/schema-solr4.xml拷贝到solrhome/solr/collection1/conf/,重命名为schema.xml,并在标签<fields>...</fields>最后添加一行(具体解释见Solr 4.2 - what is _version_field?),

<field name="_version_" type="long" indexed="true" stored="true" multiValued="false"/>

重启Solr,

# Ctrl+C to stop Solr
java -jar start.jar

第7步和第8步也和Nutch 1.7那篇博客中的7、8步很类似。主要区别在于,Nutch 2.x的所有数据,不再以文件和目录的形式存放在硬盘上,而是存放到HBase(mysql是mysql对应的数据库)里。

启动

[root@imagehost example]# echo 'nohup java -jar start.jar &' > startSolr.sh

image

日志显示server端口为8983,浏览器访问:

 

执行抓取命令:

image

image

solr后台:

image

crawl爬行日志:

image

 

 

配置hbase:

先要设置免密码登录,这是为了实现hadoop分布式自动化处理的需要:

配置ssh免密码登录(三个节点m1、s1、s2)

主节点配置:

  1. 首先到用户主目录(cd  ~),ls  -a查看文件,其中一个为“.ssh”,该文件价是存放密钥的。待会我们生成的密钥都会放到这个文件夹中。
  2. 现在执行命令生成密钥: ssh-keygen -t rsa -P ""  (使用rsa加密方式生成密钥)回车后,会提示三次输入信息,我们直接回车即可。
  3. 进入文件夹cd  .ssh (进入文件夹后可以执行ls  -a 查看文件) 
  4. 将生成的公钥id_rsa.pub 内容追加到authorized_keys(执行命令:cat id_rsa.pub >> authorized_keys)

从节点配置:

  1. 以同样的方式生成秘钥(ssh-keygen -t rsa -P "" ),然后s1和s2将生成的id_rsa.pub公钥追加到m1的authorized_keys中)
  2. 在s1中执行命令:scp id_rsa.pub m1:/root/.ssh/id_rsa.pub.s1 ,在s2中执行命令scp id_rsa.pub m1:/root/.ssh/id_rsa.pub.s2
  3. 进入m1执行命令:cat id_rsa.pub.s1 >> authorized_keys ,cat id_rsa.pub.s1 >> authorized_keys
  4. 最后将生成的包含三个节点的秘钥的authorized_keys 复制到s1和s2的.ssh目录下( scp authorized_keys s1:/root/.ssh/, scp authorized_keys s2:/root/.ssh/)

验证ssh免密码登录

  1. 输入命令ssh  localhost(主机名) 根据提示输入“yes” 
  2. 输入命令exit注销(Logout)
  3. 再次输入命令ssh localhost即可直接登录

 

。。。此处省略hbase配置。。

 

注意先启动hadoop,再启动hbase,关闭时相反

 

应该先配置hadoop,hadoop启动前执行:

bin/hadoop namenode -format

image

 

在hadoop_home/etc/haddop/下设置env.sh的java_Home参数为绝对路径,然后执行启动命令:

image

 

启动hbase,登录主页查看

image

 

 

不能加载native lib的老问题,开启debug后日志显示,当前glibc版本低于要求的。

image

升级2.12.1提示当前assemer too old,只好选择较低版本的升级。。。。

使用centos 7 没有glibc库的问题,直接使用native。

nutch2.3.1编译完成后,一定要把habase lib下的所有以hbase开头的18个jar包覆盖到nutch /runtime/local/lib下,这是hbase的驱动。

打开hbase shell模式:

image

执行:./crawl ../urls/ udast http://localhost:8983/solr 2

开始抓取:

C29OXKS`9W%J5@3BZE4~REB

 

速度好像有点太快:

image




声明: 除非注明,本文属( 阳光倾城 )原创,转载请保留链接: http://www.tomrrow.com/archives-8241.html