现在的位置: 首页 > 综合 > 正文

Linux下Nutch分布式配置和使用

2014年01月18日 ⁄ 综合 ⁄ 共 10875字 ⁄ 字号 评论关闭

介绍

      

这是本人在完全分布式环境下在
Cent-OS

配置
Nutch-1.1

时的总结文档,但该文档适合所有
Linux

系统和目前各版本的
nutch

0
集群网络环境介绍

   

集群中所有节点均是Cent-OS系统,防火墙均禁用,sshd服务均开启;所有节点上均有一个名为nutch的用户(非超级用户,安装前root使用useradd添加),用户主目录是/home/nutch。

   

集群包含三个节点:1个namenode,2个datanode,节点之间局域网连接,可以相互ping通。节点IP地址和主机名分布如下:

    10.10.97.132 gc03vm12 namenode

    10.10.97.142 gc04vm12 datanode01

    10.10.97.144 gc04vm14 datanode02

   

配置将Nutch安装在/home/nutch/nutchinstall目录下。一般最好建议安装在其它非主目录路径下,例如/usr/local下,
但此时需要使nutch用户对目录有rwx权限(nutch用户对主目录有rwx权限),一般做法是root用户在/usr/local下创建一个目录,
并修改该目录拥有者为nutch(chown –R nutch:nutch 目录路径)。

1 /etc/hosts
文件配置

    namenode
节点上vi /etc/hosts,将所有节点的名字和IP地址写入其中,写入如下内容,注意注释掉127.0.0.1行:

    10.10.97.132 gc03vm12 

    10.10.97.142 gc04vm12 

    10.10.97.144 gc04vm14 

   # 127.0.0.1     centos54 localhost.localdomain localhost

    /etc/hosts
文件需要复制到所有数据节点上。

2 SSH
无密码验证配置

    Nutch
是基于Hadoop的,Hadoop需要使用SSH协议,namenode将使用SSH协议启动namenode和datanode进程,datanode
向namenode传递心跳信息可能也是使用SSH协议,这是我认为的,还没有做深入了解,datanode之间可能也需要使用SSH协议。假若是,则需要配置使得所有节点之间可以相互SSH无密码登陆验证
)。

2.1
配置所有节点之间SSH无密码验证

(0)
原理

节点A要实现无密码公钥认证连接到节点B上时,节点A是客户端,节点B是服务端,需要在客户端A
上生成一个密钥对,包括一个公钥和一个私钥,而后将公钥复制到服务端B
上。当客户端A通过
ssh

接服务端B时,服务端B就会生成一个随机数并用客户端A的公钥对随机数进行加密,并发送给客户端A。客户端A收到加密数之后再用私钥进行解密,并将解密数
回传给B,B确认解密数无误之后就允许A进行连接了。这就是一个公钥认证过程,其间不需要用户手工输入密码。重要过程是将客户端A公钥复制到B上。

因此如果要实现所有节点之间无密码公钥认证,则需要将所有节点的公钥都复制到所有节点上。

(1)
所有机器上生成密码对

(a)
所有节点用nutch用户登陆,并执行以下命令,生成rsa密钥对:

zkl@zkl-ubuntu:~$ ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/home/zkl/.ssh/id_rsa): 
默认路径

Enter passphrase (empty for no passphrase): 
回车,空密码

Enter same passphrase again:

Your identification has been saved in /home/zkl/.ssh/id_rsa.

Your public key has been saved in /home/zkl/.ssh/id_rsa.pub.

这将在/home/nutch/.ssh/目录下生成一个私钥id_rsa和一个公钥id_rsa.pub。

(b)
将所有datanode节点的公钥
id_rsa.pub
传送到namenode

上:

cp  id_rsa.pub datanode01.id_rsa.pub

scp datanode01.id_rsa.pub namenode
节点ip地址:/home/nutch/.ssh 

......

cp  id_rsa.pub datanode0n.id_rsa.pub

(c)namenode
节点上综合所有公钥(包括自身)并传送到所有节点上

cp id_rsa.pub authorized_keys   namenode
自己的公钥

cat datanode01.id_rsa.pub >> authorized_keys

......

cat datanode0n.id_rsa.pub >> authorized_keys

   

然后使用SSH协议将所有公钥信息authorized_keys复制到所有DataNode的.ssh目录下

zkl@zkl-ubuntu:~$ scp authorized_keys data
节点ip地址:/home/zkl/.ssh 

   
这样配置过后,所有节点之间可以相互SSH无密码登陆,可以通过命令

“ssh 节点ip地址”来验证。

3 JDK
安装和Java环境变量配置

3.1
安装 JDK 1.6

root
用户登陆,在Namenode节点上新建文件夹/usr/program,下载JDK安装包
jdk-6u13-linux-i586.bin
,
复制到目录
/usr/
program

下,在命令行进入该目录,执行命令“./ jdk-6u13-linux-i586.bin”,命令运行完毕,将在目录下生成文件夹jdk1.6.0_13,安装完毕。

   
安装完成后,修改/usr/program目录拥有着为nutch用户,

    Chown -R nutch:nutch /usr/program

/usr/
program

目录需要复制到所有数据节点上。

3.2 Java
环境变量配置

      

root
用户登陆,命令行中执行命令”vi /etc/profile”,并加入以下内容,配置环境变量(注意/etc/profile这个文件很重要,后面Hadoop的配置还会用到)。

# set java environment

export JAVA_HOME=
/usr/program
/jdk1.6.0_13/

export JRE_HOME=
/usr/program
/jdk1.6.0_13/jre

export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

保存并退出,执行以下命令使配置生效

chmod +x /etc/profile

source /etc/profile

   
配置完毕,在命令行中使用命令”java -version”可以判断是否成功。

   
在nutch下测试java -version

    /etc/profile
复制到所有数据节点上。

4 Hadoop
集群配置

  

在namenode上执行:

下载nutch-1.0,将其解压到/home/nutch/nutchinstall目录下,使用如下命令:

    tar zxvf nutch-1.0.tar.gz

    (1)
配置Hadoop的配置文件

    (a)
配置hadoop-env.sh

$ vi nutch-1.0/conf/hadoop-env.sh

# set java environment

export JAVA_HOME=/usr/program/jdk1.6.0_13/

(b)
配置conf/hadoop-site.xml

Hadoop
配置参数的含义请参考Hadoop-default.xml,在lib/hadoop-xxx.core.jar中能找到。

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

 

<configuration>

 

<!—core-->

<property>

    <name>fs.default.name</name>

    <value>hdfs://gc03vm12:9000
</value>

    <description>HDFS
的URI,文件系统://namenode标识:端口号</description>

</property>

 

<property>

    <name>hadoop.tmp.dir</name>

    <value>/home/nutch/nutchinstall/hadooptmp
</value> 

    <description>namenode
上本地的hadoop临时文件夹</description>

</property>

 

<!—hdfs-->

<property>

    <name>dfs.name.dir</name>

    <value>/home/nutch/nutchinstall/hdfs/name
</value>

    <description>namenode
上存储hdfs名字空间元数据 </description>

</property>

 

<property>

    <name>dfs.data.dir</name>

    <value>/home/nutch/nutchinstall/hdfs/data
</value>

    <description>datanode
上数据块的物理存储位置</description>

</property>

 

<property>

    <name>dfs.replication</name> 

    <value>2</value>

    <description>
副本个数,不配置默认是3,应小于datanode机器数量
</description>

</property>

 

<!--mapreduce-->

<property>

    <name>mapred.job.tracker</name>

    <value>gc03vm12:9001
</value>

    <description>jobtracker
标识:端口号,不是URI</description>

</property>

 

<property>

    <name>mapred.local.dir</name>

    <value>/home/nutch/nutchinstall/mapred/local
</value>

    <description>tasktracker
上执行mapreduce程序时的本地目录</description>

</property>

 

<property>

    <name>mapred.system.dir</name>

    <value>/tmp/hadoop/mapred/system
</value>

    <description>
这个是hdfs中的目录,存储执行mr程序时的共享文件</description>

</property>

 

</configuration>

(c)
配置masters文件,加入namenode的主机名

gc03vm12 

(d)
配置slaves文件, 加入所有datanode的主机名

gc04vm12

gc04vm14

    (2)
复制配置好的各文件到所有数据节点上。

    root
用户下:

scp /etc/hosts   
数据节点ip地址:/etc/hosts

scp /etc/profile 
数据节点ip地址:/etc/profile

scp /usr/program 
数据节点ip地址:/usr/program

nutch
用户下:

scp /home/nutch/nutchinsta 
数据节点ip地址:/home/nutch/

5 Hadoop
集群启动

    Namenode
执行:

   
格式化namenode,格式化后在namenode生成了hdfs/name
文件夹

bin/hadoop namenode –format

启动hadoop所有进程,

bin/start-all.sh
(或者先后执行start-dfs.sh和start-mapreduce.sh)。

可以通过以下启动日志看出,首先启动namenode,然后启动datanode1,datanode2,然后启动secondarynamenode。再启动jobtracker,然后启动tasktracker1,最后启动tasktracker2。

   
启动hadoop成功后,在namenode中生成了hadooptmp
文件夹,在datanode中生成了hdfs
文件夹和mapred
文件夹。

namenode
上用java自带的小工具jps查看进程

zkl@zkl-ubuntu:~/$ jps

8383 JobTracker

8733 Jps

8312 SecondaryNameNode

8174 NameNode

每个datanode上查看进程

zkl@zkl-ubuntu:~/$ jps

7636 DataNode

7962 Jps

7749 TaskTracker

在namenode上查看集群状态

bin/hadoop dfsadmin –report

Configured Capacity: 16030539776 (14.93 GB)

Present Capacity: 7813902336 (7.28 GB)

DFS Remaining: 7748620288 (7.22 GB)

DFS Used: 65282048 (62.26 MB)

DFS Used%: 0.84%

 

-------------------------------------------------

Datanodes available: 2 (2 total, 0 dead)

 

Name: 10.10.97.142:50010

Decommission Status : Normal

Configured Capacity: 8015269888 (7.46 GB)

DFS Used: 32641024 (31.13 MB)

Non DFS Used: 4364853248 (4.07 GB)

DFS Remaining: 3617775616(3.37 GB)

DFS Used%: 0.41%

DFS Remaining%: 45.14%

Last contact: Thu May 13 06:17:57 CST 2010

 

Name: 10.10.97.144:50010

Decommission Status : Normal

Configured Capacity: 8015269888 (7.46 GB)

DFS Used: 32641024 (31.13 MB)

Non DFS Used: 3851784192 (3.59 GB)

DFS Remaining: 4130844672(3.85 GB)

DFS Used%: 0.41%

DFS Remaining%: 51.54%

Last contact: Thu May 13 06:17:59 CST 2010

Hadoop
的web 方式查看:
http://
namenode ip
地址
:50070

    Hadoop
查看工作情况:
http:// namenode ip

地址:50030

6 Nutch
分布式爬虫

6.1
配置Nutch配置文件

(1)

配置所有节点上的conf/nutch-site.xml文件

nutch-site.xml
文件

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<!-- Put site-specific property overrides in this file. -->

<configuration>

<property>

 <name>http.agent.name
</name>

 <value>nutch-1.0</value>

 <description>
爬虫和搜索此参数必须配置</description>

</property>

</configuration>

(2)

配置所有节点上的conf/crawl-urlfilter.txt文件

# skip file:, ftp:, & mailto: urls

-^(file|ftp|mailto):

# skip image and other suffixes we can't yet parse

-/.(gif|GIF|jpg|JPG|png|PNG|ico|ICO|css|sit|eps|wmf|zip|ppt|mpg|xls|gz|rpm|tgz|mov|MOV|exe|jpeg|JPEG|bmp|BMP)$

# skip URLs containing certain characters as probable queries, etc.

-[?*!@=]

# skip URLs with slash-delimited segment that repeats 3+ times, to break loops

-.*(/[^/]+)/[^/]+/1/[^/]+/1/

# accept hosts in MY.DOMAIN.NAME

#
允许下载所有

+^

# skip everything else

-.

6.2
执行Nutch分布式爬虫

Nutch
爬虫命令是:

    bin/nutch Crawl <urlDir> [-dir d] [-threads n] [-depth i] [-topN N]

   
其中的<urlDir>参数是入口地址文件或其所在的目录,启动了集群进行分布式爬虫时,这个目录必须是HDFS中的目录,爬虫完毕将在HDFS中生成存有爬下来的数据的目录[-dir d]。

    (1)
入口地址文件

   
在本地磁盘中新建一个文件,写入一个入口url,然后将其复制到HDFS中,使用如下命令:
    bin/hadoop dfs -copyFromLocal crawltest/urls urls

    (3)
爬虫测试,在namenode、datanode或者与集群网络连通的安装有Hadoop或者nutch并且hadoop-site.xml配置相同的客户机

上上均可使用如下命令分布式爬虫:

    bin/nutch crawl urls -dir data -depth 3 -topN 10

crawl started in: data

rootUrlDir = urls

threads = 10

depth = 3

topN = 10

Injector: starting

Injector: crawlDb: data/crawldb

Injector: urlDir: urls

Injector: Converting injected urls to crawl db entries.

Injector: Merging injected urls into crawl db.

Injector: done

Generator: Selecting best-scoring urls due for fetch.

Generator: starting

Generator: segment: data/segments/20100513022002

Generator: filtering: true

Generator: topN: 10

Generator: Partitioning selected urls by host, for politeness.

Generator: done.

Fetcher: Your 'http.agent.name' value should be listed first in 'http.robots.agents' property.

Fetcher: starting

Fetcher: segment: data/segments/20100513022002

Fetcher: done                       
第一层的网页下载完毕,depth=0

CrawlDb update: starting

CrawlDb update: db: data/crawldb

CrawlDb update: segments: [data/segments/20100513022002]

CrawlDb update: additions allowed: true

CrawlDb update: URL normalizing: true

CrawlDb update: URL filtering: true

CrawlDb update: Merging segment data into db.

CrawlDb update: done

Generator: Selecting best-scoring urls due for fetch.

Generator: starting

Generator: segment: data/segments/20100513022124

Generator: filtering: true

Generator: topN: 10

Generator: 0 records selected for fetching, exiting ...

Stopping at depth=1 - no more URLs to fetch. 
 
此处就停止了,不能下载第二层的网页,正常情况下是不会出现此错误的。

LinkDb: starting

LinkDb: linkdb: data/linkdb

LinkDb: URL normalize: true

LinkDb: URL filter: true

LinkDb: adding segment:

 hdfs://gc03vm12:9000/user/nutch/data/segments/20100513022002

LinkDb: done

Indexer: starting

Indexer: done

Dedup: starting

Dedup: adding indexes in: data/indexes

Dedup: done

merging indexes to: data/index

Adding hdfs://gc03vm12:9000/user/nutch/data/indexes/part-00000

done merging

crawl finished: data

 

爬虫完毕,hdfs中生成data目录,data目录下面有这些子目录:crawldb,index,

indexes,linkdb,segments
。所有节点上的爬虫日志在logs/hadoop.log中。上述“
Stopping at depth=1 - no more URLs to fetch.
”这个错误不知何故,我在另几台机器上相同配置爬虫却没有出现任何错误,不知何原因。一般情况下按此配置没有任何问题。

从浏览器中可以查看到分布式爬虫时作业状态:

7 Nutch
检索

       Nutch

的爬虫和搜索可以说是分离的两块,爬虫可以是
M/R

作业,但搜索不是
M/R

作业。搜索有两种方式:一是将爬虫数据
(

或者称索引数据
)

放在本地硬盘,进行搜索。二是直接搜索
HDFS

中的爬虫数据。

Nutch

自带了一个
WEB

前端检索程序,即主目录下的
nutch-x.x.war

,实现
WEB

前端检索时需要安装
Tomcat

,执行应用程序。此外,在命令行中也可执行
Nutch

检索命令。

7.1 Windows
Nutch单机搜索本地索引数据

    (1)
将HDFS中生成的存储爬虫数据的data目录复制到本地,并将data目录拷贝到windows下的某个目录中,例如D盘下。

    bin/hadoop fs –copyToLocal data data

    (2)
安装tomcat,请确保安装路径没有空格,这很重要,在windows上如果有空格将导致搜索结果始终为0。启动tomcat服务。

    (3)
将Nutch主目录下的WEB前端程序nutch-1.0.war复制到 ***/ tomcat/webapps/目录下。

(4)
浏览器中输入http://localhost:8080/nutch-1.0,将自动解压nutch-1.0.war,在webapps下生成nutch-1.0目录。

(5)
配置WEB前端程序中的nutch-site.xml文件,该文件所在目录是***/tomcat/webapps/nutch-1.0/WEB-INF/classes/下,配置如下:

<property>

 <name>http.agent.name

</name>  

不可少,否则无搜索结果

 <value>nutch-1.0</value>

 <description>HTTP 'User-Agent' request header.</description>

</property>

 

<property>

 <name>searcher.dir

</name>

 <value>D:/data

< alue> data

是爬虫生成的索引数据目录。参数值请使用绝对路径

 <description>Path to root of crawl.</description>

</property>

(6)
重启tomcat。更改配置文件后必须重启tomcat,否则不会生效。

(7)
在http://localhost:8080/nutch-1.0下检索关键字。

7.2 Linux
Nutch单机搜索本地索引数据

7.2.1 WEB
前端搜索

        

(1)

将HDFS中生成的存储爬虫数据的data目录复制到本地某一目录下。

    bin/hadoop fs –copyToLocal data data

    (2)
安装tomcat,请确保安装路径没有空格,这很重要,否则将导致搜索结果始终为0。安装完后启动tomcat服务,bin/catalina start。

    (3)
将Nutch主目录下的WEB前端程序nutch-1.0.war复制到 ***/ tomcat/webapps/目录下。

(4)
浏览器中输入http://localhost:8080/nutch-1.0,将自动解压nutch-1.0.war,在webapps下生成nutch-1.0目录。

(5)
配置WEB前端程序中的nutch-site.xml文件,该文件所在目录是***/tomcat/webapps/nutch-1.0/WEB-INF/classes/下,配置如下:

<property>

 <name>http.agent.name

</name>  

不可少,否则无搜索结果

 <value>nutch-1.0</value>

 <description>HTTP 'User-Agent' request header.</description>

</property>

 

抱歉!评论已关闭.