分享

Nutch-2.2.1系列之四Nutch抓取数据在HBase中的存储

xioaxu790 2014-11-16 19:37:08 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 64130
问题导读
1、Nutch-2.2.1爬取的数据可以存储在哪些平台中?
2、在哪个文件中查看列族定义及列的含义信息?
3、Nutch-2.2.1爬取数据的程序,主要走了哪些流程?





本文接上一篇:Nutch-2.2.1学习之三Nutch配置文件||Nutch与Hbase结合使用时常见问题

      Nutch-2.2.1爬取的数据可以存储在HBase、Accumulo、Cassandra、MySQL、DataFileAvroStore、AvroStor中,这是与Nutch-1.x系列很大的区别,在提供多样性的同时也增加了一些复杂性,比如使用不同存储时的不同配置,对特定的存储结构客户端处理方式的不同等等。这篇文章主要介绍了Nutch-2.2.1与HBase结合使用时,Nutch爬取的数据在HBase中的存储方式,或者说在HBase中都以什么样的列名存储的。

     Nutch-2.2.1爬取的数据可以存储在HBase、Accumulo、Cassandra、MySQL、DataFileAvroStore、AvroStor中,这是与Nutch-1.x系列很大的区别,在提供多样性的同时也增加了一些复杂性,比如使用不同存储时的不同配置,对特定的存储结构客户端处理方式的不同等等。这篇文章主要介绍了Nutch-2.2.1与HBase结合使用时,Nutch爬取的数据在HBase中的存储方式,或者说在HBase中都以什么样的列名存储的。

      目前还没有对Nutch-2.2.1完整的爬取过程做详细深入的学习,那如何知道爬取过程呢?在bin目录下有两个脚本文件:nutch和crawl,在命令行直接执行nutch命令会打印该脚本的使用说明,输入具体的命令又会打印对应的说明,比如:
  1. [hadoop@hadoop bin]$ ./nutch   
  2. Usage: nutch COMMAND  
  3. where COMMAND is one of:  
  4. inject     inject new urls into the database  
  5. hostinject     creates or updates an existing host table from a text file  
  6. generate       generate new batches to fetch from crawl db  
  7. fetch      fetch URLs marked during generate  
  8. parse      parse URLs marked during fetch  
  9. updatedb        update web table after parsing  
  10. updatehostdb   update host table after parsing  
  11. readdb           read/dump records from page database  
  12. readhostdb     display entries from the hostDB  
  13. elasticindex    run the elasticsearch indexer  
  14. solrindex  run the solr indexer on parsed batches  
  15. solrdedup  remove duplicates from solr  
  16. parsechecker   check the parser for a given url  
  17. indexchecker   check the indexing filters for a given url  
  18. plugin     load a plugin and run one of its classes main()  
  19. nutchserver    run a (local) Nutch server on a user defined port  
  20. junit          runs the given JUnit test  
  21. or      CLASSNAME  run the class named CLASSNAME  
  22. Most commands print help when invoked w/o parameters.
复制代码


输入inject命令后的输出如下:
  1. [hadoop@hadoop bin]$ ./nutch inject  
  2. Usage: InjectorJob <url_dir> [-crawlId <id>]
复制代码


这些信息对于初学者还是不够,这时可以参考官方说明,地址为http://wiki.apache.org/nutch/NutchTutorial,该文件介绍了Nutch-1.x和Nutch-2.x的爬取命令。在Nutch-2.x版本中,为了方便用户的使用,爬取流程所涉及的命令整合到了crawl脚本中,使用者可以通过输入./crawl<seedDir> <crawlID> <solrURL> <numberOfRounds>完成爬取流程,而不必像Nutch-2.1版本中那样,必须一步一步地执行inject、generate、fetch、parse等命令。对于初学者的我来说,决定不执行傻瓜命令(crawl命令),主要想看看每执行一步,HBase中数据的变化,所以就认真研读了crawl脚本,发现了一下几段代码:
  1. $bin/nutch inject $SEEDDIR -crawlId $CRAWL_ID  
  2. $bin/nutch generate $commonOptions -topN $sizeFetchlist -noNorm -noFilter -adddays $addDays -crawlId $CRAWL_ID -batchId $batchId  
  3. $bin/nutch fetch $commonOptions -D fetcher.timelimit.mins=$timeLimitFetch $batchId -crawlId $CRAWL_ID -threads 50  
  4. $bin/nutch parse $commonOptions $skipRecordsOptions $batchId -crawlId $CRAWL_ID  
  5. $bin/nutch updatedb $commonOptions -crawlId $CRAWL_ID  
复制代码



这些代码都是摘取的,不是完整的版本,可以打开crawl脚本查阅完整代码。这几段代码就是Nutch爬取网页的核心部分,为了一步一步查看上述每段代码的执行结果,将这些代码段分别执行。下面就介绍如何执行这些命令,并且查看执行后的结果。
首先在local目录下创建目录urls,并创建文件url,保存内容为天涯论坛的url。
按照上面的代码段首先执行inject命令,并且执行crawlId为bbs。
  1. [hadoop@hadoop local]$ bin/nutch inject urls -crawlId bbs  
  2. InjectorJob: starting at 2013-12-12 10:51:28  
  3. InjectorJob: Injecting urlDir: urls  
  4. InjectorJob: Using class org.apache.gora.hbase.store.HBaseStore as the Gora storage class.  
  5. InjectorJob: total number of urls rejected by filters: 0  
  6. InjectorJob: total number of urls injected after normalization and filtering: 1  
  7. Injector: finished at 2013-12-12 10:51:34, elapsed: 00:00:05  
复制代码



执行完毕后在HBase的shell下执行scan'bbs_webpage'命令,查看表bbs_webpage的信息,此时表bbs_webpage中已经存有url文件所含url的基本信息了。
  1. hbase(main):007:0> scan 'bbs_webpage'  
  2. ROW                                         COLUMN+CELL                                                                                                                  
  3. cn.tianya.bbs:http/                        column=f:fi, timestamp=1386817647216, value=\x00'\x8D\x00                                                                     
  4. cn.tianya.bbs:http/                        column=f:ts, timestamp=1386817647216, value=\x00\x00\x01B\xE4\xC5\xE1\x84                                                     
  5. cn.tianya.bbs:http/                        column=mk:_injmrk_, timestamp=1386817647216, value=y                                                                          
  6. cn.tianya.bbs:http/                        column=mk:dist, timestamp=1386817647216, value=0                                                                              
  7. cn.tianya.bbs:http/                        column=mtdt:_csh_, timestamp=1386817647216, value=?\x80\x00\x00                                                               
  8. cn.tianya.bbs:http/                        column=s:s, timestamp=1386817647216, value=?\x80\x00\x00                                                                     
  9. 1 row(s) in 0.0460 seconds  
复制代码



此后分别执行./nutchgenerate -topN 5 -crawlId bbs、$ ./nutch fetch1386818590-1938811668 -crawlId bbs -threads 50、./nutch parse1386818590-1938811668 -crawlId bbs、./nutch updatedb-crawlId bbs,每执行一步上面所列出的命令,都在HBaseshell下运行scan'bbs_webpage'命令查看表的内容是否发生了变化,大家会发现每执行一次命令,表中存放的数据都发生了变化。表中的数据以及内容的变化,说明Nutch爬取数据存放到HBase中时正确的。
在运行scan查看表中内容时,对于列的含义不确定时可以查看gora-hbase-mapping.xml文件,该文件定义了列族及列的含义:
  1. <table name="webpage">  
  2.         <family name="p" maxVersions="1"/>         
  3. <family name="f" maxVersions="1"/>  
  4.         <family name="s" maxVersions="1"/>  
  5.         <family name="il" maxVersions="1"/>  
  6.         <family name="ol" maxVersions="1"/>  
  7.         <family name="h" maxVersions="1"/>  
  8.         <family name="mtdt" maxVersions="1"/>  
  9.         <family name="mk" maxVersions="1"/>  
  10.     </table>  
  11.     <class table="webpage" keyClass="java.lang.String" name="org.apache.nutch.storage.WebPage">  
  12.          
  13.         <!-- fetch fields                                       -->  
  14.         <field name="baseUrl" family="f" qualifier="bas"/>  
  15.         <field name="status" family="f" qualifier="st"/>  
  16.         <field name="prevFetchTime" family="f" qualifier="pts"/>  
  17.         <field name="fetchTime" family="f" qualifier="ts"/>  
  18.         <field name="fetchInterval" family="f" qualifier="fi"/>  
  19.         <field name="retriesSinceFetch" family="f" qualifier="rsf"/>  
  20.         <field name="reprUrl" family="f" qualifier="rpr"/>  
  21.         <field name="content" family="f" qualifier="cnt"/>  
  22.         <field name="contentType" family="f" qualifier="typ"/>  
  23.         <field name="protocolStatus" family="f" qualifier="prot"/>  
  24.         <field name="modifiedTime" family="f" qualifier="mod"/>  
  25.         <field name="prevModifiedTime" family="f" qualifier="pmod"/>  
  26.         <field name="batchId" family="f" qualifier="bid"/>  
  27.   
  28.         <!-- parse fields                                       -->  
  29.         <field name="title" family="p" qualifier="t"/>  
  30.         <field name="text" family="p" qualifier="c"/>  
  31.         <field name="parseStatus" family="p" qualifier="st"/>  
  32.         <field name="signature" family="p" qualifier="sig"/>  
  33.         <field name="prevSignature" family="p" qualifier="psig"/>  
  34.          
  35.         <!-- score fields                                       -->  
  36.         <field name="score" family="s" qualifier="s"/>  
  37.         <field name="headers" family="h"/>  
  38.         <field name="inlinks" family="il"/>  
  39.         <field name="outlinks" family="ol"/>  
  40.         <field name="metadata" family="mtdt"/>  
  41.         <field name="markers" family="mk"/>  
  42.     </class>
复制代码


因为对HBase还不是特别熟悉,后面会研究一下HBase然后再继续分析所爬取到的内容,并且看看有没有方法可以在HBase shell下显示中文。



相关文章推荐





Nutch-2.2.1系列之一Nutch简介||及jar包问题解决
http://www.aboutyun.com/thread-10048-1-1.html

Nutch-2.2.1系列之二编译部署Nutch及常见问题
http://www.aboutyun.com/thread-10049-1-1.html

Nutch-2.2.1系列之三Nutch配置文件||Nutch与Hbase结合使用时常见问题
http://www.aboutyun.com/thread-10050-1-1.html




Nutch-2.2.1学习之五以伪分布模式运行Nutch
http://www.aboutyun.com/thread-10078-1-1.html

Nutch-2.2.1系列之六Nutch与Solr的集成
http://www.aboutyun.com/thread-10079-1-1.html

Nutch-2.2.1系列之七过滤抓取数据
http://www.aboutyun.com/thread-10080-1-1.html

Nutch-2.2.1系列之八Nutch过滤URL实践
http://www.aboutyun.com/thread-10081-1-1.html




没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条