nutchhtml
Nutch 是一個開源Java實現的搜索引擎。它提供了咱們運行本身的搜索引擎所需的所有工具。包括全文搜索和Web爬蟲。Nutch爲咱們提供了這樣一個不一樣的選擇. 相對於那些商用的搜索引擎, Nutch做爲開放源代碼 搜索引擎將會更加透明, 從而更值得你們信賴. Nutch的創始人是Doug Cutting,他同時也是Lucene、Hadoop和Avro開源項目的創始人。java
Nutch誕生於2002年8月,是Apache旗下的一個用Java實現的開源搜索引擎項目,自Nutch1.2版本以後,Nutch已經從搜索引擎演化爲網絡爬蟲,接着Nutch進一步演化爲兩大分支版本:1.X和2.X,這兩大分支最大的區別在於2.X對底層的數據存儲進行了抽象以支持各類底層存儲技術。node
1.x版本是基於Hadoop架構的,底層存儲使用的是HDFS(Hadoop實現了一個分佈式文件系統(Hadoop Distributed File System),簡稱HDFS。),而2.x經過使用Apache Gora(Apache Gora是一個開源的ORM框架,主要爲大數據提供內存數據模型與數據的持久化。目前Gora支持對於列數據、key-value數據,文檔數據與RDBMS數據的存儲,還支持使用Apache Hadoop來對對大數據進行分析。),使得Nutch能夠訪問HBase、Accumulo、Cassandra、MySQL、DataFileAvroStore、AvroStore等NoSQL。linux
爬蟲crawler和查詢searcher。Crawler主要用於從網絡上抓取網頁併爲這些網頁創建索引。Searcher主要利用這些索引檢索用戶的查找關鍵詞來產生查找結果。二者之間的接口是索引,因此除去索引部分,二者之間的耦合度很低。web
Nutch是基於Lucene的。Lucene爲Nutch提供了文本索引和搜索的API。常見的應用場合是:你有數據源,須要爲這些數據提供一個搜索頁面。在這種狀況下,最好的方式是直接從數據庫中取出數據並用Lucene API 創建索引。sql
在你沒有本地數據源,或者數據源很是分散的狀況下,應該使用Nutch。說道Lucene不得不說solrnutch主要用於採集網頁,solr能夠做爲搜索服務器。nutch+solr能夠搭建一個簡單的搜索引擎。簡單地講,nutch就是用於分佈式採集數據源,solr用於建索引和搜索服務。 shell
Crawler的工做原理:首先 Crawler根據WebDB生成一個待抓取網頁的URL集合叫作Fetchlist,接着下載線程Fetcher根據Fetchlist將網頁抓取回 來,若是下載線程有不少個,那麼就生成不少個Fetchlist,也就是一個Fetcher對應一個Fetchlist。而後Crawler用抓取回來的 網頁更新WebDB,根據更新後的WebDB生成新的Fetchlist,裏面是未抓取的或者新發現的URLs,而後下一輪抓取循環從新開始。這個循環過 程能夠叫作「產生/抓取/更新」循環。數據庫
在Nutch中,Crawler操做的實現是經過一系列子操做的實現來完成的。這些子操做Nutch都提供了子命令行能夠單獨進行調用。下面就是這些子操做的功能描述以及命令行,命令行在括號中。在建立一個WebDB以後(步驟1), 「產生/抓取/更新」循環(步驟3-6)根據一些種子URLs開始啓動。當這個循環完全結束,Crawler根據抓取中生成的segments建立索引 (步驟7-10)。在進行重複URLs清除(步驟9)以前,每一個segment的索引都是獨立的(步驟8)。最終,各個獨立的segment索引被合併爲 一個最終的索引index(步驟10)。express
Injector-》apache
Generator-》Fetcher-》ParseSegment-》CrawlDb update depth=1
Generator-》Fetcher-》ParseSegment-》CrawlDb update depth=2
Generator-》Fetcher-》ParseSegment-》CrawlDb update-》LinkDbdepth=3
也就是說往復循環Generator-》Fetcher-》ParseSegment-》CrawlDb update 這個過程;
1. 建立一個新的WebDb (admin db -create).
2. 將抓取起始URLs寫入WebDB中 (inject).
3. 根據WebDB生成fetchlist並寫入相應的segment(generate).
4. 根據fetchlist中的URL抓取網頁 (fetch).
5. 根據抓取網頁更新WebDb (updatedb).
6. 循環進行3-5步直至預先設定的抓取深度。
7. 根據WebDB獲得的網頁評分和links更新segments (updatesegs).
8. 對所抓取的網頁進行索引(index).
9. 在索引中丟棄有重複內容的網頁和重複的URLs (dedup).
10. 將segments中的索引進行合併生成用於檢索的最終index(merge).
Nutch的數據文件:
crawldb: 爬行數據庫,用來存儲所要爬行的網址。crawldb中存放的是url地址,第一次根據所給url:http://blog.tianya.cn進行注入,而後update crawldb 保存第一次抓取的url地址,下一次即depth=2的時候就會從crawldb中獲取新的url地址集,進行新一輪的抓取。
linkdb: 連接數據庫,用來存儲每一個網址的連接地址,包括源地址和連接地址。
segments: 抓取的網址被做爲一個單元,而一個segment就是一個單元。
http://www.cnblogs.com/huligong1234/p/3515214.html{更詳情解釋}
安裝nutch2+Hbase+Slor4
介紹
Nutch 網絡爬蟲 與1.x版本的不一樣在於,nutch2.x再也不有bin目錄了,有了新的ivy目錄用於使用ivy管理nutch。
HBase 是一個分佈式,版本化,面向列的數據庫,構建在 Apache Hadoop和 Apache ZooKeeper之上。,HBase不一樣於通常的關係數據庫,它是一個適合於非結構化數據存儲的數據庫。另外一個不一樣的是HBase基於列的而不是基於行的模式。
Solrs 搜索服務器 比如是百度搜索,谷歌的搜索
apache-nutch-2.2.1-src.tar.gz
hbase-0.98.19-hadoop2-bin.tar.gz
solr-4.5.1-src.tgz
選用的是 jdk-7u76-linux-x64.tar,進行上傳在usr下建立java文件夾
設置權限 chmod u+x jdk-7u76-linux-x64.tar
解壓tar -zxvf /usr/java/jdk-7u76-linux-x64.tar
配置環境變量
vim /etc/profile 添加下面2行
export JAVA_HOME=/usr/java/jdk1.6.0_45
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$CLASSPATH
而後從新加載配置文件source /etc/profile
輸入java -version看是否成功
使用的是單機版的HBase
因爲Hbase是一個分佈式的數據庫,因此咱們常常與Hadoop聯繫起來一塊兒用。使用這裏就能夠不於hadoop一塊兒使用,使用這裏就直接安裝單擊版的Hbase。來在官方的安裝和使用http://hbase.apache.org/book/quickstart.html{英文}http://abloz.com/hbase/book.html{中文}。看2.2 HDFS查看http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_design.html
選用的是hbase-0.98.19-hadoop2-bin.tar.gz
解壓tar -zxvf /usr/java/hbase-0.98.19-hadoop2-bin.tar.gz
進行受權chmod -R 777 hbase-0.98.19-hadoop2
從新加載配置文件
查看官網說明
在hbase-env裏面添加
export JAVA_HOME=/usr/java/jdk1.7.0_76
編輯 conf/hbase-site.xml 去配置hbase.rootdir,來選擇HBase將數據寫到哪一個目錄 .
<configuration>
<property>
<name>hbase.rootdir</name>
<value>file:////usr/java/hbase-0.98.19-hadoop2/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/java/hbase-0.98.19-hadoop2/zookeeper</value>
</property>
</configuration>咱們不須要建立data文件夾habase會幫咱們建立,若是咱們建立了hbase會幫咱們作遷移
You do not need to create the HBase data directory. HBase will do this for you. If you create the directory, HBase will attempt to do a migration, which is not what you want.
啓動Hbase
在bin目錄下start-hbase.sh
啓動後不報錯表示成功了
在安裝Nutch與Hbase結合前,能夠先參考官方文檔https://wiki.apache.org/nutch/Nutch2Tutorial
選用的是apache-nutch-2.3.1-src.tar.gz
解壓tar -zxvf /usr/java/apache-nutch-2.3.1-src.tar.gz
將nutch文件夾進行重命名mv apache-nutch-2.3.1 nutch2
chmod -R 777 nutch2
<property> <name>storage.data.store.class</name> <value>org.apache.gora.hbase.store.HBaseStore</value> <description>Default class for storing data</description></property>
gora.datastore.default=org.apache.gora.hbase.store.HBaseStore
--------------------------------------------------------------------------------------
Conf目錄下的文件有:
automaton-urlfilter.txt、gora-accumulo-mapping.xml、hbase-site.xml、nutch- site.xml、regex-urlfilter.txt、suffix-urlfilter.txt、 configuration.xsl、gora-cassandra-mapping.xml、httpclient-auth.xml、parse- plugins.dtd、schema-solr4.xml、domain-suffixes.xml、gora-hbase-mapping.xml、 log4j.properties、parse-plugins.xml、schema.xml、domain-suffixes.xsd、 gora.properties、nutch-conf.xsl、prefix-urlfilter.txt、solrindex- mapping.xml、domain-urlfilter.txt、gora-sql-mapping.xml、nutch-default.xml、 regex-normalize.xml、subcollections.xml。
對於剛開始學習Nutch的人(包括本身),比較重要的文件有三個:nutch-site.xml、gora.properties、nutch-default.xml。nutch-default.xml保存了Nutch全部可用的屬性名稱及默認的值,當須要修改某些屬性值時,能夠拷貝該文件中的屬性到nutch-site.xml中,並修改成自定義的值。不作任何配置修改的狀況,文件nutch-site.xml不包含任何屬性和屬性值,該文件用於保存用戶調整Nutch配置後的屬性{nutch2.3中nutch-site.xml設置說明 http://www.aboutyun.com/thread-10080-1-1.html}。gora.properties用於配置Gora的屬性,因爲Nutch2.x版本存儲採用Gora訪問Cassandra、HBase、Accumulo、Avro等,須要在該文件中制定Gora屬性,好比指定默認的存儲方式gora.datastore.default= org.apache.gora.hbase.store.HBaseStore,該屬性的值能夠在nutch-default.xml中查找storage.data.store.class屬性取得,在不作gora.properties文件修改的狀況下,存儲類爲org.apache.gora.memory.store.MemStore,該類將數據存儲在內存中,僅用於測試目的。本人在學習Nutch2.2.1的過程當中,存儲使用了HBase,因此在gora.properties中添加了gora.datastore.default=org.apache.gora.hbase.store.HBaseStore,在nutch-site.xml中添加了
在Nutch的conf目錄中有automaton-urlfilter.txt、regex-urlfilter.txt、suffix-urlfilter.txt、prefix-urlfilter.txt、domain-urlfilter.txt幾個文件用於實現過濾抓取數據,好比不抓取後綴爲gif、exe的文件等,經過修改其中的值能夠達到只抓取感興趣的內容的目的,在必定程度上也有助於提升抓取速度。在抓取過程當中,這幾個文件不是都起做用的,默認狀況下只有regex-urlfilter.txt會達到過濾目的,這一點能夠從Nutch-default.xml確認。在進行過濾規則的修改以前,先說明Nutch的過濾器原理。在Nutch中,過濾器是經過插件的方式實現的,插件在nutch-default.xml中定義,更詳細看{http://www.aboutyun.com/thread-10080-1-1.html}
還有ivy目錄下的ivy.xml文件,下載依賴的jar包。
選用的是apache-ant-1.9.2-bin.tar
解壓tar -zxvf /usr/java/apache-ant-1.9.2-bin.tar
將nutch文件夾進行重命名mv apache-ant-1.9.2 ant
配置環境變量
source /etc/profile
在配置nutch-2/runtime/local/conf/nutch-site.xml
在添加以下配置信息
<property><name>http.agent.name</name><value>Your Nutch Spider</value></property><property><name>http.accept.language</name><value>ja-jp, en-us,en-gb,en;q=0.7,*;q=0.3</value><description>Value of the 「Accept-Language」 request header field.
This allows selecting non-English language as default one to retrieve.
It is a useful setting for search engines build for certain national group.
</description></property><property><name>parser.character.encoding.default</name><value>utf-8</value><description>The character encoding to fall back to when no other information
is available</description></property>
在seed.txt中添加要抓取的連接 這裏以csdn爲例
cd /usr/java/nutch2/conf/
mkdir -p urls
cd urls
touch seed.txt
vim seed.txt
最後開始編譯
cd /usr/java/nutch2/
先執行ant命令
編譯runtime
ant runtim
修改nutch-2裏面ivy/ivysettings.xml配置文件中 因爲鏡像文件地址有問題
修改ivysettings.xml 中repository.apache.org值爲http://maven.restlet.org/
<property name="repository.apache.org" value="http://maven.restlet.org/" override="false"/>
修改後執行
ant runtim
可能會有的jar包下載不下來,多ant runtim幾回就行了
出現這個緣由,是因爲nutch2.x版本以前不支持hbase,因此ivy.xml配置文件中沒有注入鏈接hbase的jar包因此在ivy.xml中添加這個依賴<dependency org="org.apache.hbase" name="hbase-common" rev="0.98.8-hadoop2" conf="*->default" />
而後再編譯runtime
$:ant runtime
編譯完成後
$:cd /usr/java/nutch2/runtime/local/bin
--------------------------------------------------------------------------------------
抓取路徑最後一個本身配置的是抓取層數
Usage: crawl <seedDir> <crawlID> [<solrUrl>] <numberOfRounds>{抓取的惟一標識第二次抓的不同會進行內容得更新不是覆蓋}{後面會說道}在Nutch-2.x版本中,爲了方便用戶的使用,爬取流程所涉及的命令整合到了crawl腳本中,使用者能夠經過輸 入./crawl<seedDir> <crawlID> <solrURL> <numberOfRounds>完成爬取流程,而沒必要像Nutch-2.1版本中那樣,必須一步一步地執行inject、 generate、fetch、parse等命令。對於初學者的我來講,決定不執行傻瓜命令(crawl命令) $ /bin/ nutch inject /usr/java/nutch2/runtime/local/urls $ /bin/nutch readdb
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
抓取 numberOfRounds代表的前綴
$:./crawl /usr/java/nutch2/conf/urls/ numberOfRounds 3
抓取完成後進入hbase shell查看數據
$:hbase shell
查看列表
$:list
查看數據(numberOfRounds_webpage)爲表名,以list命令查出的表名爲準,這裏就以此表名作例子
能夠瀏覽抓取信息$:scan 'numberOfRounds_webpage'
[Nutch]Nutch重要命令使用說明 http://blog.csdn.net/kandy_ye/article/details/51295328
cd /usr/java/nutch2/runtime/local/bin/
nutch indexchecker http://www.163.com 用來檢查索引插件對應着solrindex-mapping.xml
選用的是 solr-4.10.4.tgz
拷貝到/usr/java目錄
tar -zxvf solr-4.10.4.tgz
chmod -R 777 solr-4.10.4
進入到example文件夾
cd /usr/java/solr-4.10.4/example/
啓動solr
java -jar start.jar
第二種是在bin/solr start
關閉bin/solr stop -p 8983
http://localhost:8983/solr默認端口號是8983
表示安裝啓動成功
測試了一下原代的切詞器,效果是將切成一個一個字,不是想要的效果,後期再改
解壓後的文件夾及文件介紹
contrib:Solr服務獨立運行相關依賴包
dist:可獨立運行的war和solr服務運行相關jar包
docs:Solr的相關文檔
example:提供的Solr的配置案例和基於jetty服務器的可運行的star.jar
solr配合nutch的使用
nutch的conf文件夾有些文件是用於solr索引的,好比schema-solr4.xml、schema.xml。可是我安裝的是小版本的,因此裏面沒用schema-solr4.xml這個約束,因此對其進行了下載,如何將solr和nutch聯繫起來,就是將schema-solr4.xml配置文件對solr下的schema.xml配置文件進行替換,還要將其放在nutch下的conf一份而且重命名爲schema.xm,若不修改則在啓動Solr會報找不到schema.xm的錯誤而沒法啓動Solr。 /usr/solr-4/example/solr-4.10.4/collection1/conf/schema.xml
直接訪問會報錯,
加上<field name="_version_" type="long" indexed="true" stored ="true"/>
出現這個問題,須要檢查下配置文件nutch的配置文件、
Make sure that the plugin indexer-solr is included. Go to the file: conf/nutch-site.xml and in the propertyplugin.includes add the plugin, for instance:確保indexer-solr這個插件存在,去conf/nutch-site.xml進行配置
<property>
<name>plugin.includes</name>
<value>protocol-http|urlfilter-regex|parse-(html|tika)|index-(basic|anchor)|indexer-solr|scoring-opic|urlnormalizer-(pass|regex|basic)</value>
<description>Regular expression naming plugin directory names to
include. Any plugin not matching this expression is excluded.
In any case you need at least include the nutch-extensionpoints plugin. By
default Nutch includes crawling just HTML and plain text via HTTP,
and basic indexing and search plugins. In order to use HTTPS please enable
protocol-httpclient, but be aware of possible intermittent problems with
the
underlying commons-httpclient library.
</description>
</property>
最開始的solr
執行爬蟲注入操做
Usage: crawl <seedDir> <crawlID> [<solrUrl>] <numberOfRounds>
./crawl /usr/java/nutch2/conf/urls/ sina http://localhost:8983/solr 2
· ~/urls 是存放了種子url的目錄
· TestCrawl 是crawlId,這會在HBase中建立一張以crawlId爲前綴的表,例如TestCrawl_Webpage。
· http://localhost:8983/solr/ , 這是Solr服務器
· 2,numberOfRounds,迭代的次數
http://10.10.30.61:60010/master-status
選用的版本是hadoop-2.5.2.tar.gz 將其解壓後
將其更名爲hadoop mv hadoop-2.5.2 hadoop 若是選的是其餘的版本記得修改hadoop-common的依賴
Hadoop能夠在單節點上以所謂的僞分佈式模式運行,此時每個Hadoop守護進程都做爲一個獨立的Java進程運行。
僞分佈式模式須要免密碼ssh設置,確認可否不輸入口令就用ssh登陸localhost:
ssh localhost
若是不輸入口令就沒法用ssh登錄localhost,執行下面的命令(注意:只有擁有root權限的用戶才能執行下面命令):
Shell代碼
1. ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
2. cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
修改幾個重要的配置文件(共5個)
第一個:hadoop-env.sh
添加export JAVA_HOME=/usr/java/jdk1.7.0_76
第二個:core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/data/java/hadoop/tmp</value>
</property>
</configuration>
第三個:hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
</configuration>
第四個:mapred-site.xml.template 須要重命名: mv mapred-site.xml.template mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
第五個:yarn-site.xml
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
將hadoop添加到環境變量
vim /etc/profile
export HADOOP_HOME=/data/java/hadoop
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
source /etc/profile
格式化HDFS(namenode)第一次使用時要格式化
hadoop namenode -format
驗證是否啓動成功
使用jps命令驗證 sbin/start-all.sh
http://10.10.30.61:50070 (HDFS管理界面)
http://10.10.30.61:8088 (MR管理界面)
nutch和hadoop整合
修改nutch-site.xml在單機版基礎上進行了修改 添加節點的存儲要實現序列化和反序列化
<property><name>io.serializations</name><value>org.apache.hadoop.io.serializer.WritableSerialization</value><description>A list of serialization classes that can be used for
obtaining serializers and deserializers.</description></property>
Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
因爲hadoop下載的默認是32位編譯的,咱們使用的系統是64位的,搜索要從新進行編譯
下載hadoop-native-64-2.5.2.tar將其解壓到hadoop下的lib下的native文件夾中
tar -zxvf hadoop-native-64-2.5.2.tar -C hadoop/lib/native/
先進入nutch的deply目錄:
cd nutch/runtime/deploy
和在local模式同樣 ,咱們先創建一個urls目錄,並將抓取連接放入url.txt文件裏面:
mkdir urls
echo http://www.cnbeta.com > urls/url.txt
將連接文件放入hadoop的分佈式文件系統上:
hadoop fs -put urls /urls
bin/hadoop jar /data/java/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.5.2.jar randomwriter out
使用的是hadoop的話抓取的路徑 cd /usr/java/nutch2/runtime/deploy/bin/
crawl /urls si http://localhost:8983/solr 2
1、 將IKAnalyzer-2012-4x.jar拷貝到example\solr-webapp\webapp\WEB-INF\lib下;
2、 在schema.xml文件中添加fieldType:
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>
3、 下圖設置
效果:
一、 修改默認檢索的字段名稱,df(text)-à custom_field
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">common_text</str> 檢索的字段名稱
</lst>
</requestHandler>
一、 requestHandler:用來配置執行的方法 name:指定的方法名稱 wt:響應的數據格式;df:默認檢索的字段。
二、 去掉競價排名配置(由於須要加載一個xml文件提升效率)
開始使用的是單機版默認是存儲在文件裏面的
關閉hbase的狀況下
修改hbase-site.xml添加下面字段
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
修改存儲的位置 這個存儲的文件節點文件夾不用本身建立系統會建立
開啓hbase
輸入hadoop fs -ls /hbase