Nutch Hadoop 教程

來源:互聯網
上載者:User
關鍵字 Hadoop
怎樣安裝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":

編譯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個查詢。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.