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

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解