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

相关文章

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

使用MyBatis TypeHandler实现数据加密与解密的具体方案

《使用MyBatisTypeHandler实现数据加密与解密的具体方案》在我们日常的开发工作中,经常会遇到一些敏感数据需要存储,比如用户的手机号、身份证号、银行卡号等,为了保障数据安全,我们通常会对... 目录1. 核心概念:什么是 TypeHandler?2. 实战场景3. 代码实现步骤步骤 1:定义 E

使用C#导出Excel数据并保存多种格式的完整示例

《使用C#导出Excel数据并保存多种格式的完整示例》在现代企业信息化管理中,Excel已经成为最常用的数据存储和分析工具,从员工信息表、销售数据报表到财务分析表,几乎所有部门都离不开Excel,本文... 目录引言1. 安装 Spire.XLS2. 创建工作簿和填充数据3. 保存为不同格式4. 效果展示5

Python多任务爬虫实现爬取图片和GDP数据

《Python多任务爬虫实现爬取图片和GDP数据》本文主要介绍了基于FastAPI开发Web站点的方法,包括搭建Web服务器、处理图片资源、实现多任务爬虫和数据可视化,同时,还简要介绍了Python爬... 目录一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

关于MySQL将表中数据删除后多久空间会被释放出来

《关于MySQL将表中数据删除后多久空间会被释放出来》MySQL删除数据后,空间不会立即释放给操作系统,而是会被标记为“可重用”,以供未来插入新数据时使用,只有满足特定条件时,空间才可能真正返还给操作... 目录一、mysql数据删除与空间管理1.1 理解MySQL数据删除原理1.3 执行SQL1.3 使用