1、Apache Nutch
Apache Nutch是一個用於網路搜尋的開源架構,它提供了我們運行自己的搜尋引擎所需的全部工具,包括全文檢索搜尋和Web爬蟲。
1.1、Nutch的組件結構
WebDB:儲存網頁資料和串連資訊
Fetch lists:將WebDB所儲存的串連分成多個組,來用於分布式檢索
Fetchers:檢索Fetch list中的內容並下載到本地,共有兩項輸出:分別是串連的update
資訊和內容content
Updates:更新WebDB的頁面檢索狀態
WebDB、updates、fetch lists和fetchers組成迴圈結構,不斷運行下去,來確保所得到的Web鏡像是最新的
Content:介面內容,擷取內容之後,Nutch便可以根據它來建立索引並執行查詢操作
Indexers:對目標Content建立索引,當索引內容較大時,可把索引劃分成多個索引片段,然後分配給不同的seracher實現並行檢索
Searchers:實現查詢功能的同時也會緩衝content
Webservers:有兩種角色:
1處理使用者的互動請求(Nutch Search Client)
2從searchers中擷取查詢結果(HTTP Server)
註:fetchers和searchers兩個節點所對應的操作可放到分布式環境(hadoop)中去完成
建立索引及查詢的操作可通過solr架構來實現
1.2、Nutch的資料結構:
Nutch資料包含3個目錄結構,分別是:
1、Crawldb:用於儲存Nutch將要檢索的url資訊,以及檢索狀態(是否檢索、何時檢索)
2、Linkdb:用於儲存每一個url所包含的超連結資訊(包括錨點)
3、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,名稱以時間來命名
2、Apache Hadoop
Nutch的單機採集(local方式)並不複雜,然而當所採集的資料來源較大時,一台機器難以滿足效能上的需求,因此通常的做法是將Nutch整合到Hadoop環境中以完成分布式採集和分散式查詢的效果(deploy方式)。
Hadoop架構在功能劃分上包含3個子架構,分別是:
MapReduce:用於分布式並行計算
HDFS:用於分布式儲存
Common:封裝HDFS和MapReduce所需要的實用類
2.1、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.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.3、hadoop資源
1 http://wiki.apache.org/nutch/NutchHadoopTutorial基於Nutch和Hadoop完成分布式採集和分散式查詢
3、環境搭建
3.1、需要準備
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.2、搭建配置
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.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環境