Nutch-2.2.1学习之五Nutch抓取数据在HBase中的存储

2024-01-08 04:32

本文主要是介绍Nutch-2.2.1学习之五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命令会打印该脚本的使用说明,输入具体的命令又会打印对应的说明,比如:

[hadoop@hadoop bin]$ ./nutch 
Usage: nutch COMMAND
where COMMAND is one of:inject		inject new urls into the databasehostinject     creates or updates an existing host table from a text filegenerate 	    generate new batches to fetch from crawl dbfetch 		fetch URLs marked during generateparse 		parse URLs marked during fetchupdatedb 	     update web table after parsingupdatehostdb   update host table after parsingreaddb 	      read/dump records from page databasereadhostdb     display entries from the hostDBelasticindex    run the elasticsearch indexersolrindex 	run the solr indexer on parsed batchessolrdedup 	remove duplicates from solrparsechecker   check the parser for a given urlindexchecker   check the indexing filters for a given urlplugin 	load a plugin and run one of its classes main()nutchserver    run a (local) Nutch server on a user defined portjunit         	runs the given JUnit testor      CLASSNAME 	run the class named CLASSNAME
Most commands print help when invoked w/o parameters.

输入inject命令后的输出如下:

[hadoop@hadoop bin]$ ./nutch inject
Usage: InjectorJob <url_dir> [-crawlId <id>]

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

$bin/nutch inject $SEEDDIR -crawlId $CRAWL_ID
$bin/nutch generate $commonOptions -topN $sizeFetchlist -noNorm -noFilter -adddays $addDays -crawlId $CRAWL_ID -batchId $batchId
$bin/nutch fetch $commonOptions -D fetcher.timelimit.mins=$timeLimitFetch $batchId -crawlId $CRAWL_ID -threads 50
$bin/nutch parse $commonOptions $skipRecordsOptions $batchId -crawlId $CRAWL_ID
$bin/nutch updatedb $commonOptions -crawlId $CRAWL_ID

这些代码都是摘取的,不是完整的版本,可以打开crawl脚本查阅完整代码。这几段代码就是Nutch爬取网页的核心部分,为了一步一步查看上述每段代码的执行结果,将这些代码段分别执行。下面就介绍如何执行这些命令,并且查看执行后的结果。

首先在local目录下创建目录urls,并创建文件url,保存内容为天涯论坛的url。

按照上面的代码段首先执行inject命令,并且执行crawlId为bbs。

[hadoop@hadoop local]$ bin/nutch inject urls -crawlId bbs
InjectorJob: starting at 2013-12-12 10:51:28
InjectorJob: Injecting urlDir: urls
InjectorJob: Using class org.apache.gora.hbase.store.HBaseStore as the Gora storage class.
InjectorJob: total number of urls rejected by filters: 0
InjectorJob: total number of urls injected after normalization and filtering: 1
Injector: finished at 2013-12-12 10:51:34, elapsed: 00:00:05

执行完毕后在HBase的shell下执行scan'bbs_webpage'命令,查看表bbs_webpage的信息,此时表bbs_webpage中已经存有url文件所含url的基本信息了。

hbase(main):007:0> scan 'bbs_webpage'
ROW                                         COLUMN+CELL                                                                                                                 cn.tianya.bbs:http/                        column=f:fi, timestamp=1386817647216, value=\x00'\x8D\x00                                                                    cn.tianya.bbs:http/                        column=f:ts, timestamp=1386817647216, value=\x00\x00\x01B\xE4\xC5\xE1\x84                                                   cn.tianya.bbs:http/                        column=mk:_injmrk_, timestamp=1386817647216, value=y                                                                        cn.tianya.bbs:http/                        column=mk:dist, timestamp=1386817647216, value=0                                                                            cn.tianya.bbs:http/                        column=mtdt:_csh_, timestamp=1386817647216, value=?\x80\x00\x00                                                             cn.tianya.bbs:http/                        column=s:s, timestamp=1386817647216, value=?\x80\x00\x00                                                                    
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文件,该文件定义了列族及列的含义:

<table name="webpage"><family name="p" maxVersions="1"/>        <family name="f" maxVersions="1"/><family name="s" maxVersions="1"/><family name="il" maxVersions="1"/><family name="ol" maxVersions="1"/><family name="h" maxVersions="1"/><family name="mtdt" maxVersions="1"/><family name="mk" maxVersions="1"/></table><class table="webpage" keyClass="java.lang.String" name="org.apache.nutch.storage.WebPage"><!-- fetch fields                                       --><field name="baseUrl" family="f" qualifier="bas"/><field name="status" family="f" qualifier="st"/><field name="prevFetchTime" family="f" qualifier="pts"/><field name="fetchTime" family="f" qualifier="ts"/><field name="fetchInterval" family="f" qualifier="fi"/><field name="retriesSinceFetch" family="f" qualifier="rsf"/><field name="reprUrl" family="f" qualifier="rpr"/><field name="content" family="f" qualifier="cnt"/><field name="contentType" family="f" qualifier="typ"/><field name="protocolStatus" family="f" qualifier="prot"/><field name="modifiedTime" family="f" qualifier="mod"/><field name="prevModifiedTime" family="f" qualifier="pmod"/><field name="batchId" family="f" qualifier="bid"/><!-- parse fields                                       --><field name="title" family="p" qualifier="t"/><field name="text" family="p" qualifier="c"/><field name="parseStatus" family="p" qualifier="st"/><field name="signature" family="p" qualifier="sig"/><field name="prevSignature" family="p" qualifier="psig"/><!-- score fields                                       --><field name="score" family="s" qualifier="s"/><field name="headers" family="h"/><field name="inlinks" family="il"/><field name="outlinks" family="ol"/><field name="metadata" family="mtdt"/><field name="markers" family="mk"/></class>

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



这篇关于Nutch-2.2.1学习之五Nutch抓取数据在HBase中的存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/582329

相关文章

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

Redis高性能Key-Value存储与缓存利器常见解决方案

《Redis高性能Key-Value存储与缓存利器常见解决方案》Redis是高性能内存Key-Value存储系统,支持丰富数据类型与持久化方案(RDB/AOF),本文给大家介绍Redis高性能Key-... 目录Redis:高性能Key-Value存储与缓存利器什么是Redis?为什么选择Redis?Red

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池