轉載自:http://www.open-open.com/lib/view/open1328670771405.html
html
一、Apache Nutchnode
Apache Nutch是一個用於網絡搜索的開源框架,它提供了咱們運行本身的搜索引擎所需的所有工具,包括全文搜索和Web爬蟲。apache
1.一、Nutch的組件結構緩存
WebDB:存儲網頁數據和鏈接信息網絡
Fetch lists:將WebDB所存儲的鏈接分紅多個組,來用於分佈式檢索數據結構
Fetchers:檢索Fetch list中的內容並下載到本地,共有兩項輸出:分別是鏈接的update框架
信息和內容contentssh
Updates:更新WebDB的頁面檢索狀態分佈式
WebDB、updates、fetch lists和fetchers組成循環結構,不斷運行下去,來確保所獲得的Web鏡像是最新的ide
Content:界面內容,獲取內容以後,Nutch即可以根據它來建立索引並執行查詢操做
Indexers:對目標Content建立索引,當索引內容較大時,可把索引劃分紅多個索引片斷,而後分配給不一樣的seracher實現並行檢索
Searchers:實現查詢功能的同時也會緩存content
Webservers:有兩種角色:
1處理用戶的交互請求(Nutch Search Client)
2從searchers中獲取查詢結果(HTTP Server)注:fetchers和searchers兩個節點所對應的操做可放到分佈式環境(hadoop)中去完成
建立索引及查詢的操做可經過solr框架來實現
1.二、Nutch的數據結構:
Nutch數據包含3個目錄結構,分別是:
一、Crawldb:用於存儲Nutch將要檢索的url信息,以及檢索狀態(是否檢索、什麼時候檢索)
二、Linkdb:用於存儲每個url所包含的超連接信息(包括錨點)
三、Segments:一組url的集合,他們做爲一個檢索單元,可用於分佈式檢索
Segment目錄包含如下子目錄信息:
(1) crawl_generate:定義將要檢索的url集合(文件類型爲SequenceFile)
(2) crawl_fetch:存儲每個url的檢索狀態(文件類型爲MapFile)
(3) content:存儲每個url所對應的二進制字節流(文件類型爲MapFile)
(4) parse_text:存儲每個url所解析出的文本內容(文件類型爲MapFile)
(5) parse_data:存儲每個url所解析出的元數據(文件類型爲MapFile)
(6) crawl_parse:用於及時更新crawldb中的內容(如要檢索的url已不存在等狀況)--文件類型爲SequenceFile
注:結合Nutch的數據結構和組件結構來看,crawldb至關於WebDB,而segment至關因而fetchlists.
分佈式crawl過程當中,每一個MapReduce Job都會生成一個segment,名稱以時間來命名
二、Apache Hadoop
Nutch的單機採集(local方式)並不複雜,然而當所採集的數據源較大時,一臺機器難以知足性能上的需求,所以一般的作法是將Nutch集成到Hadoop環境中以完成分佈式採集和分佈式查詢的效果(deploy方式)。
Hadoop框架在功能劃分上包含3個子框架,分別是:
MapReduce:用於分佈式並行計算
HDFS:用於分佈式存儲
Common:封裝HDFS和MapReduce所須要的實用類
2.一、MapReduce工做流程
1.將輸入源(Inputfiles)切割成不一樣的片斷,每一個片斷的大小一般在16M-64M之間(可經過參數配置),而後啓動雲端程序。
2.MapReduce程序基於master/slaves方式部署,在雲端機器中選中一臺機器運行master程序,職責包括:調度任務分配給slaves,監放任務的執行狀況。
3.在圖形中,slave的體現形式爲worker,當worker接到Map任務時,會讀取輸入源片斷,從中解析出Key/Value鍵值對,並做爲參數傳遞到用戶自定義的Map功能函數之中,Map功能函數的輸出值一樣爲Key/Value鍵值對,這些鍵值對會臨時緩存在內存裏面。
4.緩存以後,程序會按期將緩存的鍵值對寫入本地硬盤(執行如圖所示的local write操做),而且把存儲地址傳回給master,以便master記錄它們的位置用以執行Reduce操做。
5.當worker被通知執行Reduce操做時,master會把相應的Map輸出數據所存儲的地址也發送給該worker,以便其經過遠程調用來獲取這些數據。獲得這些數據以後,reduce worker會把具備相同Key值的記錄組織到一塊兒來達到排序的效果。
6.Reduce Worker會把排序後的數據做爲參數傳遞到用戶自定義的Reduce功能函數之中,而函數的輸出結果會持久化存儲到output file中去。
7.當全部的Map任務和Reduce任務結束以後,Master會從新喚醒用戶主程序,至此,一次MapReduce操做調用完成。
2.二、HDFS組件結構
同MapReduce部署結構相似,HDFS一樣具有master/slaves主僕結構
1.如圖所示中,NameNode充當master角色,職責包括:管理文檔系統的命名空間(namespace);調節客戶端訪問到須要的文件(存儲在DateNode中的文件)
注:namespace—映射文件系統的目錄結構
2.DataNodes充當slaves角色,一般狀況下,一臺機器只部署一個Datenode,用來存儲MapReduce程序須要的數據
Namenode會按期從DataNodes那裏收到Heartbeat和Blockreport反饋
Heartbeat反饋用來確保DataNode沒有出現功能異常;
Blockreport包含DataNode所存儲的Block集合
2.三、hadoop資源
1 http://wiki.apache.org/nutch/NutchHadoopTutorial基於Nutch和Hadoop完成分佈式採集和分佈式查詢
三、環境搭建
3.一、須要準備
3.1.1兩臺或以上Linux機器(這裏假定爲兩臺)
一臺機器名稱設置爲master,另外一臺設置爲slave01,兩臺機器具備相同的登陸用戶名nutch,而且將兩臺機器的etc/hosts文件設置成相同的內容,如:
192.168.7.11 master
192.168.7.12 slave01
……
這樣,即可以經過主機名找到對應的機器
3.1.2搭建ssh環境
ssh的安裝可經過以下命令完成:
$ sudo apt-get install ssh
$ sudo apt-get install rsync
3.1.3安裝JDK
$ apt-get install openjdk-6-jdkopenjdk-6-jre
3.1.4下載最近版本的hadoop和nutch
下載地址:
Hadoop: http://www.apache.org/dyn/closer.cgi/hadoop/common/
Nutch: http://www.apache.org/dyn/closer.cgi/nutch/
3.二、搭建配置
3.2.1SSH登陸配置
(1)在master機器上經過如下命令生成證書文件authorized_keys
$ ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
(2)將證書文件複製到其餘機器的用戶主目錄下
$scp /home/nutch/.ssh authorized_keys nutch@slave01:/home/nutch/.ssh/authorized_keys
經過以上兩步操做,master機器即可以在不須要密碼的狀況下ssh到slave01機器上
3.2.2HADOOP配置
同ssh登陸證書的配置相似,HADOOP配置一樣是在master機器上完成,而後在複製到slave機器上,確保每一臺機器的hadoop環境相同
$HADOOP_HOME/conf目錄下:
(1)hadoop-env.sh文件
export HADOOP_HOME=/PATH/TO/HADOOP_HOME
export JAVA_HOME=/PATH/TO/JDK_HOME
export HADOOP_LOG_DIR=${HADOOP_HOME}/logs
(2)core-site.xml文件
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master:9000</value>
</property>
</configuration>
(3)hdfs-site.xml文件
<configuration>
<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>dfs.replication</name>
<value>1</value>
</property>
</configuration>
(4)mapred-site.xml文件
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master:9001</value>
</property>
<property>
<name>mapred.map.tasks</name>
<value>2</value>
</property>
<property>
<name>mapred.reduce.tasks</name>
<value>2</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>
</configuration>
(5)masters和slaves配置
將相應的機器IP加到對應的配置文件中去
3.2.3 Nutch配置
$NUTCH_HOME/conf目錄下
(1)nutch-site.xml文件
<property>
<name>http.agent.name</name>
<value>Nutch Spider</value>
</property>
(2)regex-urlfilter.txt
添加須要檢索的url
+^http://([a-z0-9]*\.)*nutch.apache.org/(3)將修改後的文件放到NUTCH_HOME/runtime/deploy/nutch-*.job中
3.三、啓動運行
3.3.1 啓動Hadoop
1.格式化namenode節點
bin/hadoop namenode –format
2.啓動hadoop進程
bin/start-all.sh
啓動成功後,可經過以下url查看NameNode和MapReduce運行狀態
NameNode: http://master:50070/
MapReduce: http://master:50030/
3.向hdfs放入測試數據
$ bin/hadoop fs -put conf input
4.執行測試
$ bin/hadoop jar hadoop-examples-*.jar grep input output'dfs[a-z.]+'
5.關閉hadoop進程
bin/stop-all.sh
3.3.2 運行Nutch
1啓動前提:
(1).hadoop已成功啓動
(2).將HADOOP_HOME/bin路徑添加到環境變量中,以便Nutch找到hadoop命令
經過修改/etc/enviroment配置文件實現
(3)在控制檯執行export JAVA_HOME=/PATH/TO/JAVA命令
2向HDFS中存入待檢索數據
$ bin/hadoop fs -put urldir urldir
注:第一個urldir爲本地文件夾,存放了url數據文件,每行一個url
第二個urldir爲HDFS的存儲路徑
3啓動nutch命令
在NUTCH_HONE/runtime/deploy目錄下執行如下命令
$ bin/nutch crawl urldir –dir crawl -depth 3 –topN 10
命令成功執行後,會在HDFS中生成crawl目錄
注:必定要在deploy目錄下執行該命令,在local目錄下執行的是單機採集,而沒有使用hadoop環境