Nutch Hadoop 教程

怎樣安裝Nutch和 Hadoop

搜尋網頁和郵件列表,彷佛不多有關於如何使用Hadoop (曾經的DNFS)分佈式文件系統( HDFS )和MapReduce來安裝Nutch的文章 。 本教程的目的是經過逐步講解的方法,來說解了如何在多節點的Hadoop文件系統上運行Nutch,包括可以同時索引(爬取)和搜尋多臺機器。html

這篇文檔沒有涉及到Nutch或Hadoop架構。它只是講述瞭如何讓系統啓動和運行。 然而,在教程的最後,若是您想更多地瞭解Nutch和Hadoop的體系結構,我將指給您相關的資源。java

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

首先,我進行了一些設置而且 使用了根層級的存取。 這包括在多個機器上創建同一個用戶以及在用戶主目錄以外創建一個本地的文件系統。安裝Nutch和Hadoop並不必定非要根存取 (雖然有時它很是便利)。若是您沒有根訪問權限,您將須要把同一個用戶安裝在全部您正在使用的機器上,並且您可能須要在您的主目錄內使用一個本地文件系統。node

二,因爲Hadoop使用SSH來啓動從服務器,全部的機器都 將須要有一個SSH服務器在運行(不僅是一個客戶端)。linux

三,本教程使用的是 Whitebox Enterprise Linux 3 Respin 2(WHEL)。那些不知道Whitebox的人能夠認爲它是一個RedHatEnterprise Linux的克隆版本。您應該可以將它推廣到任意linux系統,但我使用系統是Whitebox。web

四,本教程使用Nutch 0.8 Dev Revision 385702,並且也許並不能與Nutch或Hadoop的將來版本兼容 。shell

五,經過本教程咱們在6臺不 同的電腦上安裝Nutch。 若是您使用的是不一樣數量的機器,您仍然應該能夠完成,但您至少應該有兩臺不一樣的機器,以證實HDFS和MapReduce的 分佈能力。數據庫

六,本指南中,咱們從源頭創建Nutch 。能夠獲得Nutch和Hadoop的每頁構建,我以後會給您那些連接。apache

七,請記住,這是一本從我個 人安裝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/RemoteExceptionRemoteException]: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

相關文章
相關標籤/搜索