分享

Nutch+Hadoop环境搭建

 520jefferson 2014-07-05

以前搭建环境或是配置软件从来都没有留Tips的习惯,但实践证明这是错误的——做过不等于记得怎么做,遇到过的错误也不等于今后就不是错误了。Nutch跟Hadoop的搭建困扰了我很久,但回头看看又觉得真正有些问题的其实就几个关键点,所以觉得花些时间写个简单流程,缅怀一下最近的探索,也希望能给想要搭建Nutch或hadoop的同学提供一些帮助。欢迎大家指正。 

想要说明一下的是,虽然说hadoop诞生于nutch,但现在hadoop已经完全独立为一个分布式框架,我们可以简单地理解为nutch只是跑在hadoop基础之上的一个分布式应用程序(实现的功能是开源的搜索引擎:crawl+index+search)。根据我的实践,Nutch+hadoop的配置关键还是在于hadoop环境的搭建。

Hadoop 环境搭建

1.     硬件环境及软件选择

硬件环境:2台Fedora虚拟机(我自己实验的时候用了4台,有两台在另外一位同学的机子上,所以现在就不占用了),机器情况如下表:

计算机名

IP

内存

角色

Namenode

172.18.218.34

1G

Namenode+datanode

Datanode1

172.18.218.44

512M

Datanode

另外,两个linux系统都创建了一个名为hadoop的用户。

至于nutch,我选择的是1.2版本,因为这个版本集成了Hadoop,不用再单独去下载Hadoop,而且兼容性较好。

下载地址:http://apache.//nutch/ ,如果有需要,也可以从我这里拷贝。

2.     Hosts文件修改

节点之间的通信有时候会用到IP地址,有时候会用到计算机名,所以需要给出节点IP地址跟计算机名的对应,linux系统中这种对应关系体现在/etc/hosts文件中,编辑hosts文件,按“IP   计算机名”的形式把各个节点写进hosts文件。

其中::1这一行是跟IPv6相关的,不需要去理会。其中127.0.0.1这一行是要注释掉的,不然之后运行hadoop的时候会出现“Bad connection to DFS”的错误,DFS是hadoop的文件系统。每次重启系统,hosts文件中都会自动自动加上一行127.0.0.1(原因不解),运行hadoop之前都要把这一行kill掉才行。

对于机器datanode1,hosts文件也要做类似处理。

3.     SSH无密码访问

Hadoop集群中节点都是通过ssh相互联系,进行数据传输,我们不可能为每次连接输入访问密码(常规ssh需要访问密码),所以我们需要进行相应配置,使节点之间的ssh连接不需要密码。 我们可以通过设置密钥来实现。

首先在namenode跟datanode上安装ssh(一般情况下已经默认安装了)。

然后在所有的节点(包括namenode跟datanode)上创建公钥私钥。

创建公钥私钥命令: ssh-keygen –t rsa

期间会要求输入一些信息,直接按回车就可以。这样,在默认的路径/home/hadoop/.ssh 目录下创建私钥 id_rsa 和一个公钥 id_rsa.pub 。

对于 datanode 节点:

将自己的公钥发送到 namenode 上:

#cp id_rsa.pub  datanode1_rsa.pub

#scp  datanode1_rsa.pub  172.18.218.34:/home/hadoop/.ssh

这里需要注意,由于每个 datanode 节点都要将自己的公钥传到 namenode 的相同路径下,因此,各个 datanode 发送的公钥文件名不能相同。这里使用 cp 命令,在每台 datanode 节点上将公钥文件复制为唯一名字的文件。

对于 namenode 节点:

在收到所有 datanode 发送过来的公钥文件之后,要综合这些文件(包括自身),并将这些文件发送到每个节点上:

#cp id_rsa.pub  authorized_keys

#cat datanode1_rsa.pub >>authorized_keys

把公钥authorized_keys拷贝到所有节点的.ssh文件夹下:

#scpauthorized_keys 172.18.218.44:/home/hadoop/.ssh 

这时一定要查看一下 ssh 配置是否成功,查看方式是使用 ssh 命令: ssh 其他机器 ip ,如果不需要密码就可以登录,就说明配置成功。如果还需要密码,干脆无法登录,则需要重启电脑。重启之后再次使用 ssh 命令,如果还需要密码或者无法登录,则需要重新配置一遍。

4.     JDK安装

JDK的安装我不想多说,需要注意的是:

1,  JDK版本要1.6以上的。

2,  各个节点JDK的安装路径最好是一样的,这样方便以后的统一管理,我的两台Fedora,JDK的路径都是/usr/lib/jvm/java-1.6.0;

3,  一般JDK安装完成后CLASSPATH跟PATH这两个环境变量都已经设置好了,但JAVA_HOME一般是没有自动设置的,而这个环境变量又恰恰是Hadoop所必需的,所以我们需要设置环境变量,永久的环境变量改变是修改文件/etc/profile。

#vim /etc/profile

在文件的末尾加入如下一行

(注意:具体路径看个人机器的安装路径,“=”两端不能有空格,我在此处犯了很久的迷糊),

为了让文件的修改立即生效,可以键入如下命令

#source  /etc/profile

为了验证JDK的安装成功,我们可以键入命令

#java  -version

出现的不是错误提示就说明JDK安装成功。

5.     Hadoop集群配置

把先前下载下来的apache-nutch-1.2-bin.zip压缩包解压到hadoop主目录下,生成一个nutch-1.2的文件夹(zip压缩文件可以用命令uzip解压)。

接下来就要对hadoop进行配置了。

进入nutch-1.2/conf文件夹,我们可以看到很多配置文件,首先我们需要修改的是hadoop-env.sh文件,取消对export JAVA_HOME的注释,并改成JDK的相应路径(为什么先前设置了JAVA_HOME,这里却需要再次进行设置,不是很理解)

l   

# set java environment

export JAVA_HOME=/usr/lib/jvm/java-1.6.0

 

然后是三个XML配置文件,core-site.xml 、hdfs-site.xml 、mapred-site.xml,这三个文件是配置的关键。(注意,下文中的红色字体全部为注释用,请不要在配置文件中加入这些注释。)

l  打开 core-site.xml

<configuration>

         <property>

         //此属性决定哪台机器是namenode以及端口,注意“//”

 

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

         <value>hdfs://172.18.218.34:9000</value>

        </property>

        <property>

         //临时文件夹的存放位置

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

                  <value>/home/hadoop-0.20.2/hadooptmp</value>

        </property>

</configuration>

 

l  打开 hdfs-site.xml

<configuration>

         <property>

         //datanode数据存放位置

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

                  <value>/usr/local/hadoop-0.20.2/data</value>

        </property>

        <property>

         //namenode数据存放位置

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

                  <value>/usr/local/hadoop-0.20.2/name</value>

        </property>

        <property>

         //数据副本的数量,最小为1,不能比datanode的数量大。一般采用的策略是3,一个存本机,一个存同机架的不同节点,另外一个存不同机架

                  <name>dfs.replication</name>

                  <value>1</value>

<description> 副本个数,不配置默认是3 </description>

        </property>

 

</configuration>

 

l  打开 mapred-site.xml

<configuration>

         <property>

         //jobtracker节点IP跟端口

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

                  <value>172.18.218.44:9001</value>

        </property>

        <property>

         //tasktracker临时数据存放路径

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

                  <value>/home/hadoop-0.20.2/temp</value>

        </property>

        <property>

         //每个task的map数量,暂时不知道具体怎么设置,但一般是datanode的数倍

                  <name>mapred.map.tasks</name>

                  <value>20</value>

        </property>

        <property>

         //每个task的reduce数量,暂时也不知道怎么设置会比较好,但一般情况下是datanode的数量

                  <name>mapred.reduce.tasks</name>

                  <value>2</value>

        </property>

</configuration>

在配置完 xml 文件之后,需要手动创建目录 /home/hadoop-0.20.2 。

 

另外两个需要配置的是conf/masters 、 conf/slaves两个文件,前者告诉每个节点哪个是namenode,后者告诉每个节点datanode有哪些。

 

l  打开 masters 文件,加入 namenode 主机名

namenode

 

l  打开 slaves 文件,加入 datanode 主机名

namenode

datanode1

 

至此,hadoop的集群配置完成了,为了测试配置是否正常,我们需要启动hadoop,并进行测试,启动hadoop之前,一定要把防火墙kill掉,命令如下:

 

#/etc/init.d/iptables stop

 

为了避免每一次启动系统都要敲一遍命令,我的做法是直接关掉防火墙的开机自启动,命令如下:

 

#chkconfig iptables off

 

Cd到nutch-1.2目录下,所有的执行程序都在其中的bin目录中。

1,  格式化DFS,其实也就是对namenode进行格式化

 

#bin/hadoop  namenode  -format

 

2,  启动hadoop进程

 

#bin/start-all.sh

 

3,  对hadoop运行进行测试,看是否正常

Hadoop-0.20.2的许多发行包中都有自带的测试程序包hadoop-examples-0.20.203.jar,里面有些简单的分布式hadoop程序,如单词计数、排序等,我们下载的这个包里面没有自带测试程序(如果有需要那个examples包的可以找我要),所以我们键入命令

#bin/hadoop  dfsadmin  -report

如果集群状态正常,并且每个datanode都“起来”了,那么就可以说hadoop的配置成功了。

另外,两个URL是我们应该知道的,http://namenode’s IP:50070 跟http://namenode’s IP:50030,可以比较直观地查看hadoop执行系统

Nutch 配置

 

1.     单机(without Hadoop)测试

单机不想展开讲,写这个标题只是为了说明nutch也是可以单机运行的,只要不启动hadoop ,不在HDFS中crawl就行了。

 

2.     集群测试

配置 Nutch 配置文件

 

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

 

nutch-site.xml 文件

 

<?xml version="1.0"?> <?xml-stylesheettype="text/xsl" href="configuration.xsl"?> <!-- Putsite-specific property overrides in this file. -->

 

<configuration>

<property>

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

<value>nutch-1.2</value>

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

</property>

</configuration>

 

l  配置所有节点上的conf/crawl-urlfilter.txt文件//这是URL的过滤规则,另外有一个文件regex-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 asprobable queries, etc.

 

-[?*!@=]

 

# skip URLs with slash-delimited segment thatrepeats 3+ times, to break loops -.*(/[^/]+)/[^/]+/1/[^/]+/1/

 

# accept hosts in MY.DOMAIN.NAME

 

# 允许下载所有    //一般是设置这个地方,比如我想只抓取youku的视频文件,那么可以这样写 +^http://v.youku.com/v_show/[a-zA-Z0-9_]*.html

 

+^

 

# skip everything else

 

-.

 

在执行爬虫之前,要创建一个本地文件,名为 urls : touch /usr/local/nutch-1.2/urls

在文件内写入要爬的网址,如 http://www.youku.com/v_showlist/t2c0d4.html, 每个一行。

 

执行爬虫命令:

 

#cd /usr/local/nutch-1.2/bin

#./hadoop dfs –copyFromLocal /usr/local/nutch-1.2/urlsurls 

#./nutch crawl urls -dir data -depth 3 -topN 10

 

注意:

 

#./hadoop dfs –copyFromLocal/usr/local/nutch-1.2/urls urls

 

该命令中的最后一个参数urls指的是hdfs 中的urls 文件,也就是说,将本地的某个urls 文件复制到hdfs 中。该命令执行之后,就会在hdfs 中的/user/hadoop/ 目录下创建一个名为urls 的文件。

 

#./nutch crawl urls -dir data -depth 3 -topN 10

 

该命令就是以hdfs 中的urls 文件作为爬虫要爬的入手地址,爬取的深度为3(也就是说可以从初始网页经过3次链接点击可以到达的页面),每一次抓取的网页是排名前10的网页,nutch执行过程当中产生的数据放在HDFS文件夹data内。

出现类似如下信息,则表明nutch执行结束了。

 

到目前为止,我们已经crawl到了自己想要的网页,做好了网页分析,做好了index。为了查看结果,我们需要设置tomcat,在浏览器中查看此搜索引擎工作的结果。

 

3.     Tomcat浏览结果

1.       安装 tomcat6

Fedora的话就可以直接yum安装

 

2.      配置 tomcat 环境变量

#vim /etc/profile

在 umask 022 之前添加:

export CATALINA_HOME=/usr/share/tomcat    //这个看个人的tomcat安装路径

    #source /etc/profile

   

3.      启动tomcat6

#/etc/init.d/tomcat6  start              //版本不同启动方式可能不同,这个具体可以上网查

 

4.      在 tomcat 中配置 nutch

将 nutch-1.2 目录下的nutch-1.2.war 复制到 tomcat 安装目录下的 webapps 目录下( ***/ tomcat/webapps/ )

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

 

配置***/tomcat/webapps/nutch-1.2/WEB-INF/classes/ 目录下的core-site.xml 文件

 

<property>

 

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

<value>hdfs://172.18.218.34:9000</value>

<description> </description>

</property>

 

配置 ***/tomcat/webapps/nutch-1.2/WEB-INF/classes/ 目录下的nutch-site.xml 文件

 

<property>

<name>http.agent.name</name>不可少,否则无搜索结果

<value>nutch-1.0</value>

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

</property>

 

<property>

  //tomcat的查询目录(索引目录),属于HDFS目录

<name>searcher.dir</name>

<value>/user/hadoop/data</value>

</property>

 

按照上面的配置之后,启动tomcat ,可以成功,但是在使用中文时会发现乱码,因为NUTCH 本身页面是unicode ,而TOMCAT 给的应该是GBK ,所以有这个问题,改一下***/tomcat/conf/server.xml

   <Connector port="8080" protocol="HTTP/1.1"

              connectionTimeout="20000"

              redirectPort="8443"/>

 

改为

   <Connector port="8080" protocol="HTTP/1.1"

              connectionTimeout="20000"

              redirectPort="8443" URIEncoding='utf-8'/>

就是加了个编码。

重启 tomcat

#/etc/init.d/tomcat6 restart

 

在浏览器中输入 http://localhost:8080/nutch-1.2 ,出现如下页面:

文本框中输入搜索关键词,单机“搜索”,就可以得到匹配的网页,按照网页排名依次排下来。

 

4.     常用口令

1.      hadoop  namenode -format

格式化namenode,也就是格式化HDFS文件系统

2.      start-all.sh

开始hadoop进程

3.      stop-all.sh

结束hadoop进程

4.      hadoop dfsadmin –report

报告HDFS的情况,datanode运行情况

5.      hadoop dfsadmin –safemode leave

离开安全模式,当有提示信息说处于安全模式的时候用这条指令

6.      hadoop fs  –ls  X

HDFS中的ls指令

7.      hadoop fs  –rmr  X

HDFS中的rm指令,注意的是该指令删除文件夹也不会给出提示信息

8.      hadoop fs  –copyFromLocal X  X

把文件从本地copy到HDFS,第一个是本地文件路径,第二个是DFS中的文件路径。

9.      hadoop fs  -copyToLocal X  X

把文件从HDFS copy到本地  ,第一个是DFS中的文件路径,第二个是本地路径。

10.  nutch  crawl X  –dir X  -depth X -topN X

nutch执行命令,第一个X为urls文件路径,第二个X为数据保存文件夹,第三个X是抓爬的深度,第四个X代表每层抓爬的网页数

11.  nutch  readdb X/crawldb  -stats

报告nutch执行情况,包括抓取的网页数等等,X表示data文件夹的路径

12.  nutch  readseg -dump X/segments/* X [-noparse  –nofetch  –nogenerate –noparsedata  –nocontent  -noparsetext]

把数据库中的相关数据提取到HDFS中的文本文件。第一个X表示DFS中data文件夹路径,第二个X表示把数据提取到的文件。后面的可选参数可以选择需要提取的内容。

 

结束语

这只是nutch(hadoop)系统的初步搭建,具体的功能还需要同志们去细细挖掘,nutch的话可能就只是做做crawler,做做搜索引擎,hadoop可是潜力无穷的哈。

另外,部分常规配置我参照了网上前人的资料,但都是我亲身实践过证明可行的。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多