Nutch Hadoop 教程

Hadoopp 12年前發布 | 7K 次閱讀 屌絲

怎樣安裝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

 本文由用戶 Hadoopp 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!