Nutch Hadoop 教程

12年前

怎样安装Nutch和 Hadoop


搜寻网页和邮件列表,似乎很少有关于如何使用Hadoop (曾经的DNFS)分布式文件系统( HDFS )和MapReduce来安装Nutch的文章 。 本教程的目的是通过逐步讲解的方法,来讲解了如何在多节点的Hadoop文件系统上运行Nutch,包括能够同时索引(爬取)和搜寻多台机器。

这篇文档没有涉及到Nutch或Hadoop架构。它只是讲述了如何让系统启动和运行。 然而,在教程的最后,如果您想更多地了解Nutch和Hadoop的体系结构,我将指给您相关的资源。

本教程的有些事情是预先假定的:

首 先,我进行了一些设置并且 使用了根层级的存取。 这包括在多个机器上建立同一个用户以及在用户主目录之外建立一个本地的文件系统。安装Nutch和Hadoop并不一定非要根存取 (虽然有时它非常便利)。如果您没有根访问权限,您将需要把同一个用户安装在所有您正在使用的机器上,而且您可能需要在您的主目录内使用一个本地文件系 统。

二,由于Hadoop使用SSH来启动从服务器,所有的机器都 将需要有一个SSH服务器在运行(不只是一个客户端)。

三,本教程使用的是 Whitebox Enterprise Linux 3 Respin 2(WHEL)。那些不知道Whitebox的人可以认为它是一个RedHatEnterprise Linux的克隆版本。您应该能够将它推广到任意linux系统,但我使用系统是Whitebox。

四,本教程使用Nutch 0.8 Dev Revision 385702,而且也许并不能与Nutch或Hadoop的未来版本兼容 。

五,通过本教程我们在6台不 同的电脑上安装Nutch。 如果您使用的是不同数量的机器,您仍然应该可以完成,但您至少应该有两台不同的机器,以证明HDFS和MapReduce的 分布能力。

六,本指南中,我们从源头建立Nutch 。可以得到Nutch和Hadoop的每页构建,我之后会给您那些链接。

七,请记住,这是一本从我个 人安装Nutch和Hadoop经验出发的教程。如果出现错误,尝试搜索以及发邮件到Nutch或Hadoop用户邮寄清单。 而且,欢迎提出有助于改善本教程的建议。

网络设置


首 先请允许我安排将在我们的安装中使用的电脑情况的设置。为了安装Nutch和Hadoop,我们准备了7台从750Mghz至1.0 GHz之间的商品电脑。 每台计算机至少有128Megs的RAM和至少10G硬盘。一台电脑拥有两个750Mghz的CPU并且另一台拥有两个30Gigabyte的硬盘。所有 这些电脑均是以$ 500.00的清售价买入的。我告诉您这些,是想让您知道,您并不一定要有大的硬件来启动并运行使用Nutch和Hadoop 。我们的电脑是像这样命名的:

devcluster01
devcluster02
devcluster03
devcluster04
devcluster05
devcluster06

我们的主节点是devcluster01 。由主节点运行Hadoop服务,协调与从节点(所有其他的计算机上),在这台机器上,我们履行检索和部署我们的搜索网站。

下载Nutch和 Hadoop


Nutch和Hadoop都是可以从apache网站上下载的。必要的Hadoop是与Nutch捆绑在一起的, 所以除非您打算开发Hadoop,否则您只需要下载Nutch。

在把Nutch的源从版本库 下载后,我们需要根据它构建Nutch。这里有Nutch和Hadoop的每页构建:

http://cvs.apache.org/dist/lucene/nutch/nightly/

http://cvs.apache.org/dist/lucene/hadoop/nightly/

我使用eclipse来开发,因而我使用了eclipse插件下载Nutch和Hadoop的版本库。eclipse的subversion插件可以通过使用下面链接下载更新:

http://subclipse.tigris.org/update_1.0.x

如果您使用的不是eclipse,您将需要得到版本控制客户端。只要您有一个版本控制客户端,您就可以浏览Nutch的版本控制网页:

http://lucene.apache.org/nutch/version_control.html

或者,您也可以通过用户端访问Nutch 的版本库:

http://svn.apache.org/repos/asf/lucene/nutch/

从服务器下载代码到myEclipce,也可以下载到一个标准文件系统中。我们要利用ant来构建它,因此如果您安装了Java和ant,那么将会更方便。

我不打算讲解如何安装Java或ant,如果您正在使用这些软件您应该知道该怎么做,而且有大量关于ant软件建设的教 程。如果您想要一本完整的ant参考书,推荐使用Erik Hatcher的书 "Java 开发与Ant":

http://www.manning.com/hatcher

编译Nutch和 Hadoop


一旦您将Nutch下载到下载目录,您应该看到以下文件夹和文件:

+ bin
+ conf
+ docs
+ lib
+ site
+ src
        build.properties (add this one)
        build.xml
        CHANGES.txt
        default.properties
        index.html
        LICENSE.txt
        README.txt

新增一个build.properties文件并且在它里面添加一个叫做dist.dir的变量,它的值为要构建nutch的位置。所以,如果您是基于 Linux构建,将看起来就像这样:

dist.dir=/path/to/build

这一步实际上是可选的,Nutch将在它所解压的默认目录里创建一个构建目录,但我更喜欢把它构建到一个外部的目录。 您可以为这个构建目录随便命名,但我建议使用一个新的空文件夹来构建。请记住,如果构建文件夹不存在必须自己构建。

像这样调用ant包任务来构建nutch:

ant package

这应将nutch构建到您的构建文件夹中。当它完成时您准备开始部署和配置nutch。

建立部署架构


一旦我们将nutch部署到所有六个机器,我们要调用脚本start-all.sh来启动主节点和数据节点上的服务。这意味着,该脚本将启动主节点上的hadoop守护进程,然后将ssh到所有的从节点,并启动从节点的守护进程。

start-all.sh脚本期望nutch是精确地安装在每一台机器完全相同的位置上。同时也期望Hadoop在每台机器完全相同的路径上存储数据。

我们这样做的目的是在每台机器上构建以下目录结构。搜索目录是Nutch的安装目录。该文件系统是hadoop文件系统的根文件。主目录是nutch用户的主目录。在我们的主节点,为了进行搜索我们还安装了一个tomcat5.5服务器。

/nutch
  /search
    (nutch installation goes here)
  /filesystem
  /local (used for local directory for searching)
  /home
    (nutch user's home directory)
  /tomcat    (only on one server for searching)

我 不会细谈如何安装tomcat,有大量讲述如何做到这一点的教程。我要说的是,我们移除了所有webapps目 录下的网络应用程序文件,并在webapps下建立了一个名为ROOT的文件夹,我们解压Nutch的网络应用程序文件(nutch - 0.8 - dev.war)到这个文件夹里。这令编辑Nutch网络应用程序文件中的配置文件变得很容易。因此,登录到主节点和所有从节点的根目录。用下面的命令构 建nutch用户和不同的文件系统:

ssh -l root devcluster01

mkdir /nutch
mkdir /nutch/search
mkdir /nutch/filesystem
mkdir /nutch/local
mkdir /nutch/home

groupadd users
useradd -d /nutch/home -g users nutch
chown -R nutch:users /nutch
passwd nutch nutchuserpassword

同 样如果您没有根层级的存取,您将仍然需要在每台机器上有同样的用户,正如start-all.sh脚本期望的那样。没有必要创立一个名为nutch user的用户,虽然我们是这么使用的。也可以把文件系统放到公共用户的主目录下。 基本上,您不必root用户,但如果是的话这会有帮助。

启动主从节点上后台程序的 start-all.sh脚本将需要能够通过ssh以password-less模式登录。为此, 我们将不得不在每个节点上安装ssh密钥。由于主节点将会在它自身上启动后台程序,我们还需要能够使用较少密码登录到本机。

您可能会看到一些关于用户 列表的旧教程或资料,它们介绍说您将需要编辑ssh守护进程来满足PermitUserEnvironment属 性,并且还需要安装本地环境变量来通过一个环境文件使用ssh登录。现在已经不需要这样做了。我们不再需要编辑ssh守护进程,并且我们可以安装环境变量 在hadoop-env.sh文件内。用vi打开hadoop-env.sh文件:

cd /nutch/search/conf
vi hadoop-env.sh

以下是一个需要在hadoop-env.sh文件中改变的环境变量的模板:
export HADOOP_HOME=/nutch/search
export JAVA_HOME=/usr/java/jdk1.5.0_06
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
export HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves

在 这个文件中还有其它一些将影响Hadoop的行为的变量。 如果当您开始运行脚本后获得ssh错误,尝试改变HADOOP_SSH_OPTS变量。还注意到,在经过最初的复制后,您可以在您的conf/ hadoop-env.sh中设置HADOOP_MASTER,它将把主机上的异机变化从主机同步到每一个从机上。下面有一节是讲述如何做到这一点的。

下 一步我们为主节点构建键值,并向每一个从节点复制。这必须要在我们之前创建的nutch用户下进行。不要只登录为 nutch用户,启动一个新的shell并登录为nutch用户。 如果如果您以password-less模式登陆的话,安装在测试中不会正常进行,但是当一个新用户作为nutch用户登录时将会正常进行。

  cd /nutch/home

  ssh-keygen -t rsa (Use empty responses for each prompt)
  Enter passphrase (empty for no passphrase):
  Enter same passphrase again:
  Your identification has been saved in /nutch/home/.ssh/id_rsa.
  Your public key has been saved in /nutch/home/.ssh/id_rsa.pub.
  The key fingerprint is:
  a6:5c:c3:eb:18:94:0b:06:a1:a6:29:58:fa:80:0a:bc nutch@localhost

 

在主节点将会复制公钥到您刚刚构建的在同一目录的一个名为authorized_keys的文件:

cd /nutch/home/.ssh
cp id_rsa.pub authorized_keys

您只需要在主节点上运行ssh-keygen。在每一个从节点上,当文件系统被创建后,您只需要通过使用scp复制这些键值。

scp /nutch/home/.ssh/authorized_keys nutch@devcluster02:/nutch/home/.ssh/authorized_keys

nutch 用户第一次使用必须输入密码。一个SSH propmt在您第一次登录到每一台电脑时将会出现,来询问您是否要添加计算到已知的主机。对propmt回答确定。一旦密钥被复制以后,您作为 nutch用户登录时不再需要输入密码。登陆刚复制键值的从节点来进行测试:

ssh devcluster02
nutch@devcluster02$ (a command prompt should appear without requiring a password)
hostname (should return the name of the slave node, here devcluster02)

一旦我们创建了ssh键值,我们准备开始在所有的从节点部署nutch。

部署Nutch到单台机器


首 先,我们将部署nutch到一个单一节点,主节点,但在分布式模式下运转它。这意味着将使用Hadoop的文件 系统,而不是本地的文件系统。我们将开启一个单一节点,以确保所有的一切都在运行,然后将移至新增的其它的从节点。以下的所有都是以nutch用户身份进 行的。我们将在主节点上安装nutch,然后当我们已经准备好,我们将整个安装复制到各个从节点。首先使用类似于下面的命令,来从nutch构建复制文件 到部署目录中:

cp -R /path/to/build/* /nutch/search
 

然后确保所有的shell脚本是在unix格式并且是可执行的。

dos2unix /nutch/search/bin/*.sh /nutch/search/bin/hadoop /nutch/search/bin/nutch
chmod 700 /nutch/search/bin/*.sh /nutch/search/bin/hadoop /nutch/search/bin/nutch
dos2unix /nutch/search/config/*.sh
chmod 700 /nutch/search/config/*.sh

当 我们第一次尝试安装nutch时,我们遇到了坏的解释程序和命令, 却没有发现错误,因为脚本是在Linux上的dos格式,而不是可执行的。请注意,我们正在做的是既有bin目录又有config目录。在config目 录中有一个名为hadoop-env.sh的文件,它会被谓的其它脚本调用。

有几个脚本您需要了解。在 bin目录下有nutch脚本, hadoop脚本,start-all.sh脚本和stop-all.sh脚本。nutch脚本是用来做像开启nutch爬取之类的事的。hadoop脚 本可以让您与hadoop文件系统相互配合。start-all.sh脚本启动所有主从节点上的服务器。stop-all.sh 停止所有服务器。

如果您想看nutch的选项,使用下面的命令:

bin/nutch
 

或者,如果您想看到hadoop的选项,使用:

bin/hadoop

如果您想看Hadoop如分布式文件系统之类的元件的选项,那么使用 元件名称作为输入,如下:

bin/hadoop dfs

还 有一些文件您需要了解。在conf目录下有nutch- default.xml,nutch-site.xml,hadoop-default.xml和hadoop-site.xml。在nutch- default.xml文件中保存有nutch的所有默认选项,hadoop-default.xml文件保存有hadoop的所有默认选项。要覆盖所有 的这些选项,复制各个属性到各自的*-site.xml文件中来改变它们的值。下面我会给您一个hadoop-site.xml文件的例子和一个 nutch-site.xml文件的例子。

config目录中还有一个 名为slaves的文件。这就是我们放置从节点名字的地方。 由于我们运行数据从节点和主节点在同一台机器上,我们还需要在从节点名单上的本地计算机。以下是从节点文件开始时会显示的样子。

localhost

它以这种方式开始,所以您不应该做任何更改。然后,我们将所有的节点 加入到这个文件,每行一个节点。下面就是一个hadoop-site.xml文件的例子。

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

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

<configuration>

<property>
<name>fs.default.name</name>
<value>devcluster01:9000</value>
<description>
The name of the default file system. Either the literal string
"local" or a host:port for NDFS.
</description>
</property>

<property>
<name>mapred.job.tracker</name>
<value>devcluster01:9001</value>
<description>
The host and port that the MapReduce job tracker runs at. If
"local", then jobs are run in-process as a single map and
reduce task.
</description>
</property>

<property>
<name>mapred.map.tasks</name>
<value>2</value>
<description>
define mapred.map tasks to be number of slave hosts
</description>
</property>

<property>
<name>mapred.reduce.tasks</name>
<value>2</value>
<description>
define mapred.reduce tasks to be number of slave hosts
</description>
</property>

<property>
<name>dfs.name.dir</name>
<value>/nutch/filesystem/name</value>
</property>

<property>
<name>dfs.data.dir</name>
<value>/nutch/filesystem/data</value>
</property>

<property>
<name>mapred.system.dir</name>
<value>/nutch/filesystem/mapreduce/system</value>
</property>

<property>
<name>mapred.local.dir</name>
<value>/nutch/filesystem/mapreduce/local</value>
</property>

<property>
<name>dfs.replication</name>
<value>1</value>
</property>

</configuration>

nutch使用fs.default.name属性,以确定要使用的 文件系统。由于我们使用的是hadoop文件,我们必须向hadoop主节点或名称节点指明这一点。在这种情况下,我们网络上的名称节点是被安置在服务器 devcluster01:9000上的。

hadoop包有两个元件。 其中之一是分布式文件系统。二是mapreduce功能。分布式文件系统让您可以在很多商品机上储存和复制文件,mapreduce包使您可以轻松地执行 并行编程任务。

分 布式文件系统有名称节点和数据节点。当客户端要使用文件系 统中的一个文件时,它会联系名称节点,后者会告诉它要联系哪个数据节点以获取这个文件。名称节点是协调员并存储有什么块(而不是真的文件,但您现在可以这 样认为它们)存储在什么计算机上面,以及什么需要复制到不同的数据节点上这些信息。这些数据节点任务繁重。它们的工作包括存储实际的文件,为它们的要求服 务等等。所以如果您正在运行一个名称节点和与它在同一台计算机上的一个数据节点,它仍然会通过sockets进行通信,就好像数据节点在一台不同的计算机 上一样。

在这里我不会细谈mapreduce如何工作,这是一个在另 一本教程中给出的话题,当我自己比较深刻了解它了时,我会写一本教程。不过现在只是把mapreduce的编程任务分割成map操作(a -> b,c,d)和reduce操作(list-> a)。一旦一个问题已被分解成map和reduce操作,那么多个map操作和多个reduce操作可以是分布式的以在不同的服务器上并行运行。因此,并 不是把一个文件交给一个文件系统节点,而是我们移交一个进程操作到一个节点,这个节点将会处理这个进程操作,并返回结果到主节点。mapreduce的协 调服务器被称为mapreduce作业跟踪器。 每个执行处理的节点有一个被称之为任务追踪器的守护进程在运行,它与mapreduce作业跟踪器相连接。

文件系统和mapreduce的节点与它们的主节点通过每5-10秒左右一次的持续心跳(像爆鸣声)进行通信。如果心跳 停止,那么主节点假定此节点已关闭,并在后面的操作中不再使用它。

mapred.job.tracker 属性指定了主机mapreduce跟踪器,所以我猜测可能名称节点和mapreduce跟踪器在不同的计算机上。然而我还没有做相关事情来验证我的猜想。

mapred.map.tasks 和 mapred.reduce.tasks属性记录要并行运行任务的数目。这应该是您所拥有计算机数目的一个倍数。在我们的情况中,因为开始我们已经有了一 台计算机,因而我们将有2个map和2个reduce任务。之后,随着我们增添更多的节点,我们将增加这些值。

dfs.name.dir属性是名称节点所使用的目录,用来为数据节点存储跟踪和协调信息。

dfs.data.dir属性是数据节点所使用的目录,用来存储实际的文件系统数据块。请记住,这一点是被期望在每一 个节点上都是相同的。

mapred.system.dir 属性是mapreduce跟踪器用来存储它数据的目录。 这只是在跟踪器上的,而不是在mapreduce主机上的。

mapred.local.dir 属性是在mapreduce用来储存本地数据的节点上的目录。我发现 mapreduce使用了大量的本地空间来完成其任务(即在千兆字节空间中)。然而那可能仅仅看我如何进行我的服务器配置了。我还发 现,mapreduce所产生的中间文件似乎并没有在任务退出时被删除。也可能是我的配置问题。这个属性也被期望在每一个节点上都相同。

dfs.replication 属性记录一个文件在使用前应该复制到的服务器的数目。 由于我们当前只用一个单一的服务器,我们的这个数目是1。 如果您设置此值高于您能使用的数据节点的数目,那么您将在日志中开始看到大量的(Zero targets found,forbidden1.size = 1)类型错误。随着我们添加更多的节点,我们将增加该值。

在您启动hadoop服务器之前,确保您格式化分布式文件系统为同一个名称节点:

bin/hadoop namenode -format

现在我们已经配置好了我们的hadoop和从节点文件,是时候在单一节点上启动hadoop并测试它是否工作正常了。要以nutch用户身份启动所有在本地计算机上的hadoop服务器(名称节点,数据节点, mapreduce跟踪器,作业跟踪器)请使用下面的命令:

cd /nutch/search
bin/start-all.sh

 

要停止所有服务器,您可以使用下面的命令:

bin/stop-all.sh

如 果一切已正确安装,您应该可以看到输出结果,提示名称节点,数据节点,作业跟踪器,以及任务跟踪器服务工作已经开始。如果您看到这些,意味着我们已经准备 好测试文件系统了。您也可以看看在/nutch/search /logs路径下的日志文件,来查看我们刚刚启动的来自不同的后台程序服务的输出。

为了测试文件系统,我们要创造一个链接列表,后面我们将用来爬取。运行下面的命令:

cd /nutch/search
mkdir urls
vi urls/urllist.txt

http://lucene.apache.org

您现在应该有一个urls/urllist.txt文件,它的一行指 向apache lucene的网站。现在,我们要补充目录到文件系统中。之后nutch爬取将利用这一文件作为一个链接列表来爬取。要添加链接目录到文件系统中,请运行 下面的命令:

cd /nutch/search
bin/hadoop dfs -put urls urls

您应该看到提示目录已添加到文件系统的输出。通过使用ls命令,您也可以证实该目录已被添加:

cd /nutch/search
bin/hadoop dfs -ls

有 意思的是,分布式文件系统是针对具体用户的。如果您用nutch用 户来存储一个目录链接,它实际上是存储为/user/nutch/urls。这意味着完成爬取并存储它在分布式文件系统中的用户一定要是那个开启搜索的用 户,否则将没有结果返回。通过以不同的用户身份登陆并且如图所示的运行ls命令,您可以自己尝试这个。它不会找到目录,因为它是寻找在一个不同的目录 /user/username下寻找,而不是/user/nutch 下。

如果一切工作顺利,那么您 可以添加其它节点,并开始爬取。

部署Nutch到多台机器


一旦您使得单一节点启动和运行,我们可以将配置复制到其他从节点上,并设置这些将被开启的从节点启动脚本。首先,如果您还有服务器运行在本地节点上,那么使 用stop-all脚本来停止它们。

运行下面的命令复制配置到其它机器。如果您遵循了配置,事情应该会顺利进行:

cd /nutch/search
scp -r /nutch/search/* nutch@computer:/nutch/search

为 您要使用作从节点的每一台计算机做这些事情。接着编辑从文件,添加 每个从节点名称到这个文件,每行一个。您也将要修改hadoop-site.xml文件,并改变map和reduce任务的数目值,使它成为您所拥有机器 数目的一个倍数。 对于我们有6个数据节点的系统,我把任务数目定为32。复制属性也可以改变。 一个良好的开始值是比如2 或 3. *这样的。(见底部关于可能必须清理新数据节点文件系统的注释)。 一旦做到这一点您应该能够启动所有的节点。

就像前面那样我们使用相同的命令来启动所有的节点:

cd /nutch/search
bin/start-all.sh

类似'bin/slaves.sh uptime'的命令是一种很好的在调用start-all.sh脚本前用来测试配置是否正确的方式。

第 一次启动所有的节点,可能会出现ssh对话框,来需询问是否添加主机到known_hosts文件。您必须每一个都 输入yes并按回车键。开始时输出会有一点奇怪,但如果对话不断出现请一直输入yes并按回车。您应该看到输出显示所有在本地机器上的服务器启动以及从节 点上的作业跟踪器和数据节点服务器启动。一旦完成这个,我们就准备好开始我们的爬取了。

执行Nutch抓取


现在我们有分布式文件系统的启动和运行,我们可以开始我们nutch爬取。 在本教程中我们只去爬取一个单点。比起关心别人是否能够了解nutch的爬取方面,我更关心如何能够安装分布式文件系统和mapreduce。

为了确保我们爬取只是一个单点,我们要编辑crawl urlfilter文件,设置过滤器为只读取lucene.apache.org:

cd /nutch/search
vi conf/crawl-urlfilter.txt

change the line that reads:   +^http://([a-z0-9]*\.)*MY.DOMAIN.NAME/
to read:                      +^http://([a-z0-9]*\.)*apache.org/

我们已经添加我们的链接到分布式文件系统中并且已经编辑了urlfilter,现在要开始爬取了。使用下面的命令启动nutch爬取:

cd /nutch/search
bin/nutch crawl urls -dir crawled -depth 3

我们使用的是nutch爬取命令。这个链接是我们增加到分布式文件系统的链接目录。-dir爬取是输出目录。这也将前往分布式文件系统。深度为3这意味着它只会有3个网页链接深。还有其他的选项,您可以指定,见这些选项的 命令文件。

您应该看到爬取启动,看到运行中作业的输出以及map和 reduce百分比。您可以通过将您的浏览器指向主名称节点来跟踪作业:

http://devcluster01:50030

您也可以启动新终端到从节点中,跟踪日志文件来查看此从节点的详细输出。爬取可能会需要一段时间才能完成。当它完成时我们已经准备好做搜索了。

执行搜索


要在分布式文件系统上搜索我们刚刚建立的索引,我们需要做两件事。首先,我们需要将索引放到一个本地文件系统中,第二我们需要安装和配置nutch网络应用 程序文件。虽然技术上是可行的,但是使用分布式文件系统做搜索是不明智的。

DFS是MapReduce进 程结果的记载,包括完全索引,但它的搜索时间太长。在一个生产系统中您会想要使用MapReduce系 统来建立索引并且在DFS上存储结果。然后,您要复制这些索引到一个本地文件系统中以便于搜索。如果索引太大(有1亿页索引),您会想分割索引到多个分片 ( 每个分片1-2百万页),从DFS将索引片复制到本地文件系统中,并且从那些本地索引片中读入多个搜索服务器。全分布式搜索设置的主题,在另外的教程中会 专门介绍。但现在请认识到,您不希望使用DFS进行搜索,您要使用本地文件系统进行搜索。

一旦DFS上已经创建索引,可以像这样使用hadoop copyToLocal命令将其移动到本地文件系统中。

bin/hadoop dfs -copyToLocal crawled /d01/local/

您 的爬取目录应该有一个索引目录,它应包含实际的索引文件。之后使用 Nutch和Hadoop时,如果您有一个文件夹的索引目录在它里面,如part-XXXXX,您可以使用nutch合并命令,来合并部分索引成一个单一 索引。 搜索网站在被指向本地时,将寻找一个有一个索引文件夹的目录,它包含了合并后的索引文件或一个包含部分索引的索引文件夹。这可能是一个棘手的部分,因为您 的搜索网站可以正常工作,但如果它没有找到索引那么所有的搜索将返回空。

如果您像我们之前提到的那 样安装了tomcat服务器,那么您应该有一个tomcat安装在/nutch / tomcat下,并且在webapps目录中您应该有一个名为ROOT的文件夹,ROOT文件夹中有解压缩的nutch网络应用程序文件。现在我们只需要 配置应用程序以使用分布式文件系统搜索。我们这样做是通过在WEB-INF/classes目录下编辑hadoop-site.xml文件。请使用以下命 令:

{{ cd /nutch/tomcat/webapps/ROOT/WEB-INF/classes vi nutch-site.xml }}}

以下是模板nutch - site.xml文件:

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

<configuration>

<property>
<name>fs.default.name</name>
<value>local</value>
</property>

<property>
<name>searcher.dir</name>
<value>/d01/local/crawled</value>
</property>

</configuration>

fs.default.name属性指向本地来寻找本地索引。了解了这一点,我们不是使用DFS或MapReduce做搜索,全部都是在本地机器上的。

searcher.dir 是索引以及由此产生的数据库在本地文件系统存储的目录。在我们的爬取命令之前,我们使用爬取目录,它存储了在DFS上爬取结果。然后,我们复制爬取文件夹 到我们本地文件系统的/d01 /local目录下。因此,我们把这个属性指向/d01/local/crawled。所指向的路径不应该只包含索引目录,还应该有数据库连接,分片,等 等。所有这些不同的数据库都被这次搜索使用。 这就是为什么我们复制爬取目录,并不仅仅是索引目录。

nutch-site.xml文件编辑好后,应用程序就可以准备运行了。您可以用下面的命令开始tomcat:

cd /nutch/tomcat
bin/startup.sh

然 后使用浏览器访问 http://devcluster01:8080 (您的搜索服务器)看到Nutch搜索网络应用。如果一切已正确配置,那么您应该能够进入查询和取得成果。 如果网站能够工作,但您没得到任何结果,可能是因为索引目录没有被发现。该searcher.dir属性必须被指定为目录索引的父级。此父级必须包含这个 索引分片部分,数据库连接,爬取文件夹。该索引文件夹必须命名为index并且包含有合并的分片索引,这意味着索引文件在索引目录下,而不是在下面的目 录,比如名为part- xxxx的目录,或者索引目录必须命名为indexes而且包含有名为part-xxxxx的分片索引,这些分片索引掌握着索引文件。我更喜欢合并索引而 不是分片索引。

分布式搜索


虽然不是本教程真正的主题,分布式搜索需要注意。 在一个生产系统中,您将使用DFS和MapReduce来创建索引和相应的数据库 (即crawldb )。但您会利用专用搜索服务器上的本地文件系统来搜索它们,来保证速度并避免网络开销。

这 里简要说明您如何设置分布式搜索。 在nutch-site.xml文件tomcat WEB-INF/classes目录中,您可以将searcher.dir属性指向一个包含了search-servers.txt文件的文件。 search-servers.txt文件看起来就像这样。

devcluster01 1234
devcluster01 5678
devcluster02 9101

每一行包含一个机器名称和端口,代表了搜索服务器。 这告诉网站连接到在这些端口上的搜索服务器。

在 每个搜索服务器上,因为我们正在寻找本地目录搜索,您需要确保nutch-site.xml文件中的文件系统指向本地。其中一个可以跨越的问题是,我是使 用与我运行分布式搜索服务 器时所使用的相同的nutch分配,来为DFS和MR作为一个从节点运行。问题是当分布式搜索服务器启动时,它是在DFS中寻找文件读入的。它无法找到他 们,我只获得了日志消息称x服务器有0分片。

我发现最容易的是在一个单独 的文件夹中再创建另一个nutch。然后从这个单的分配启动分布式搜索服务器。我只是使用了默认的配置,nutch-site.xml和hadoop- site.xml文件都没有配置。这默认的文件系统在本地,并且分布式搜索服务器能够在本地机器上找到它需要的文件。

无论您怎样做到这一点,如果您的索引是在本地文件系统中的,那么配置需要指出使用本地文件系统,如下显示。这通常是hadoop-site.xml文件中设置的。

<property>
<name>fs.default.name</name>
  <value>local</value>
  <description>The name of the default file system.  Either the
literal string "local" or a host:port for DFS.</description>
</property>

在每个搜索服务器,通过像这样使用nutch服务器命令,您可以启动分布式搜索服务器:

bin/nutch server 1234 /d01/local/crawled

启 动的服务器所在的端口一定要符合你输入到search- servers.txt文件中的以及本地的索引文件夹父级的目录。一旦每台机器上的分布式搜索开始,您可以启动该网站。然后搜索正常进行,可能会发生搜索 结果被撤出分布式搜索服务器索引的例外。在登录搜索网站(通常是catalina.out文件)以后,您应该看到有信息告诉您网站相关的和正在搜索的服务 器和索引分片的数量。这将使您知道安装是否正确无误。 没有来命令关闭分布式搜索服务进程,只能手动关闭。 好消息是,网站在它的search-servers.txt文件中不断检查服务器,来确定他们是否工作,使你可以关闭一个单一的分布式搜索服务器,改变其 索引并把它备份然后网站将自动重新连接。在任何时间整个搜索从不关闭,只有特定部分的索引将关闭。

在一个生产环境中,搜索是消耗最多机器 和电力的。原因是,一旦索引需要超出约2百万个网页,它花了太多的时间从磁盘读 出,所以您可以有1亿页索引在一台机器上而不必管硬盘有多大。值得庆幸的使用分布式搜索,您可以有多个专用搜索服务器,每一个都有自己的索引片来完成并行 的搜索。这让非常大的索引系统可以有效地进行搜索。

1亿页的页面系统将需要大 约50个专用搜索服务器来提供每秒20多个的查询服务。一个不必有这么多的机器的方法是使用多处理器机器,它们有可以运行多个搜索服务器的多个磁盘,每一 个使用一个独立的磁盘和索引。走这条路线,您可以使机器成本下降了50 %之多,电力成本的下降多达75 % 。一个多磁盘机不能处理像一个专用的单磁盘机那样多的每秒查询,但它能够处理的索引页面明显更大,所以它平均来讲更加有效。

同步代码到从节点


Nutch 和Hadoop能够将主节点的变化同步到从节点。然而这是可选的,因为它减慢了服务器的启动,而且您可能不希望将变化自动同步到从节点。

如 果您想启用此功能,下面我会向您展示如何配置您的服务器来完成从主节点的同步。有几件事您应该事先知道。一,即使从 节点可以从主节点同步,第一次您还需要先复制基础安装到从节点上,来时脚本对于同步是可用的。我们做到了上述这样就不需要做任何改变了。二,同步发生的方 式是,主节点ssh到从节点,并调用bin/ hadoop - daemon.sh 。从节点上的脚本调用rsync回到主节点。这意味着,您必须有一个可以从每个从节点登录到主节点上去的password-less模式的登陆。在我们安 装password-less登陆模式之前,现在我们需要逆着做。三,如果您对rsync选项有问题(我有问题,我不得不修改选项,因为我执行的是旧版的 ssh),在bin/ hadoop - daemon.sh脚本82行左右的地方调用rsync命令。

所以,第一件我们需要做的事是安装在conf/hadoop-env.sh文件中hadoop主节点的变量。如下修改变 量:

export HADOOP_MASTER=devcluster01:/nutch/search
 

这将需要复制到所有的从节点:

scp /nutch/search/conf/hadoop-env.sh nutch@devcluster02:/nutch/search/conf/hadoop-env.sh

最 后,您需要登录到每一个从节点,为每台机器构建一个默认的SSH键 值,然后将其复制回主节点,在主节点上您将它附加到/nutch/home/.ssh/authorized_keys文件中。以下是每个从节点的指令, 当您复制键值文件回主节点时一定要改变从节点名字,这样您就不会覆盖文件:

ssh -l nutch devcluster02
cd /nutch/home/.ssh

ssh-keygen -t rsa (Use empty responses for each prompt)
  Enter passphrase (empty for no passphrase):
  Enter same passphrase again:
  Your identification has been saved in /nutch/home/.ssh/id_rsa.
  Your public key has been saved in /nutch/home/.ssh/id_rsa.pub.
  The key fingerprint is:
  a6:5c:c3:eb:18:94:0b:06:a1:a6:29:58:fa:80:0a:bc nutch@localhost

scp id_rsa.pub nutch@devcluster01:/nutch/home/devcluster02.pub

一旦您对每个从节点进行这样的操作,您可以附加文件到主节点的 authorized_keys文件:

cd /nutch/home
cat devcluster*.pub >> .ssh/authorized_keys

这样安装后,无论什么时候运行bin/start-all.sh,脚本文件都会从主节点同步到每一个从节点。

结论


我知道这是一个很长的教程,但希望您能通过它熟悉nutch和hadoop 。Nutch和Hadoop是复杂的应用,如你所学到的那样设置他们并不一定是一件轻而易举的事。 我希望,这篇文档能够帮助到您。

如果有任何意见或建议,请随时发送电子邮件给我nutch-dev@dragonflymc.com 。如果您对它们有疑问,Nutch或Hadoop有各自的邮件地址。以下是关于Nutch和Hadoop的使用和开发的各种资源 。

更新


  • 我不再使用rsync同步代码服务器。我现在用expect脚本和Python脚本来管理和自动化系统。
  • 我使用的分布式搜索每个索引分片有1-2百万页。 我们现在有多处理器和多磁盘(每机4盘)的服务器来运行多个搜索服务器(每盘一个服务器) ,以降低成本和功耗的要求。 有800万网页的一台服务器可以每秒处理10个查询。
资源

Google MapReduce论文:如果您想更多了解Hadoop所使用的MapReduce架构,那么阅读这些论文是很有用的。

http://labs.google.com/papers/mapreduce.html

Google文件系统论文:如果您想更多了解Hadoop所使用分布式文件系统架构,那么阅读关于Google文件系统实现的论文是很有用的

http://labs.google.com/papers/gfs.html

构建Nutch-开源搜索:Doug Cutting写的一个有用的论文,关于开源搜索和特殊的Nutch。

Hadoop 0.1.2-dev API:

http://www.netlikon.de/docs/javadoc-hadoop-0.1/overview-summary.html


- 我, S tephenHalsey,使用本教程,并发现它非常有用的,但是当我试图增加额外的数据节点时,日志中的错误信息说:“2006-07-07 18:58:18,345 INFO org.apache.hadoop.dfs.DataNode:Exception:org.apache.hadoop.ipc.[http://wiki.apache.org/nutch/RemoteException RemoteException]:org.apache.hadoop.dfs.UnregisteredDatanodeException:Data node linux89-1:50010is attempting to report storage ID DS-1437847760. Expecting DS-1437847760. ” 。 我想这是因为在新的数据节点上的hadoop/filesystem/data/storage文件是相同的,它们有同从原始数据复制过来的数据一样的数 据。要克服这一问题,我关闭了在名称节点上使用bin/stop-all.sh的一切,并删除了新数据节点上在/filesystem目录下一切,以使它 们能够整洁,在名字节点运行bin/start-all.sh,然后看到,新数据节点上的文件系统已经被创建,随之还有新的hadoop /filesystem/data/storage文件和新目录,从那以后似乎一切运转正常。如果您不开启任何数据节点就按照上述过程做,这可能不是一个 问题,因为它们都将是空的,但对我来说,因为在我复制dfs到新的数据节点上之前,我放了一些数据在这个单一数据节点系统的dfs上。我不知道在下面的这 个过程中我是否犯了其它错误,但是我只是加上这个注释给那些在读这篇文章同时遇到同样的问题的人。文章写的非常好,非常有帮助。史蒂夫。


好教程! 我试图设置,而无需提供新东西,只是为了测试(nutch 0.8) 。我遇到了几个问题。但是,我让它工作了。一些经验 :

  • 使 用绝对路径的DFS的位置。听起来奇怪的是,我是用这个,但我想在我的Windows笔记本电脑上建立一个单一的节点hadoop,然后扩展在Linux 上。 因此,相对路径名称会派上用场,因为它们将是相同的机器。不要尝试这一点,不会起作用的。当我切换到绝对路径时,DFS之前显示的 “ .. ”目录消失。
  • 使DFS在Windows上完全 运行。 我总是最后获得这一异常: “Could not complete write to file e:/dev/nutch-0.8/filesystem/mapreduce/system/submit_2twsuj/.job.jar.crc by DFSClient_-1318439814 ”- nutch似乎还没有在Windows上做过很多测试。所以,使用Linux操作系统。
  • 别使用挂载在NFS上的DFS(这将是非常愚蠢的,但只是用于测试,人们可能只设置一个NFS的homre目录)。DFS使用锁,NFS可能被配置为不允许使用锁。
  • 当您第一次启动hadoop ,在名称日志里会有一个可以忽略的警告“dfs.StateChange - DIR* FSDirectory.unprotectedDelete: failed to remove e:/dev/nutch-0.8/filesystem/mapreduce/.system.crc because it does not exist”

  • 如果您的错误是像 “failed to create file [...] on client [foo] because target-length is 0, below MIN_REPLICATION (1)”这样的 ,这意味着块不能分发。 最有可能的是没有数据节点运行,或数据节点有一些严重的问题(如上述提到的锁问题) 。

本教程的工作适合我,但我碰到的一个问题,即我的爬取是行不通的。 原来,那是因为我需要来设置用户代理和爬取的其他属性。 如果有人读这一点,并碰到同样的问题,看看更新教程

http://wiki.apache.org/nutch/Nutch0%2e9-Hadoop0%2e10-Tutorial?highlight=%28hadoop%29%7C%28tutorial%29