整套大数据学习资料(视频+笔记)百度网盘无门槛下载:http://www.edu360.cn/news/content?id=3377

16.3.2数据结构

hadoop 花牛 9℃ 0评论

在Nutch系统中维护着几种主要的数据结构,它们都利用Hadoop I/O类和 数据格式来构造。根据数据使用目的和数据创建之后的访问方式,这些数 据可以使用Hadoop的映射(map)文件或顺序(sequence)文件进行保存。 因为数据是MapReduce的作业产生和处理的,而这一过程反过来又会执行几个mapreduce任务,所以它的硬盘存储格式符合常用的Hadoop输出 格式,即 MapFileOutputFormat 和 SequenceFileOutputFormat 两种格式。精确地说,数据被保存成几个不完整的map文件或顺序文件,而文件 数和创建数据作业中的reduce任务数相等。为简单起见,在下面几节的介 绍中,我们将忽略这点。

1. CrawlDb

CrawlDb存储每个URL的当前状态信息,存储文件是map文件,形式是 <url, CrawlDatum>,这里键(key)使用Text类型定义,值(value)使用Nutch特定的CrawlDatum类型(它实现Writable接口)。

为了对这些记录提供快速的随机访问能力(有时对于诊断是有用的,这时用户会想在CrawlDb里面检査单个记录信息),这些数据被存储成map文件而 不是顺序文件。

CrawlDb最初通过Tnjector工具创建,它只是简单地把初始URL列表(种子 列表)的纯文本文件转换成一个map文件,格式如前所述。接着,用爬取和 解析的网页信息来对它做更新。稍后将对此进行详细介绍。

2.LinkDb

这个数据库为Nutch记载的每个URL存储“入链接”(incoming link)信息。 它采用map文件格式<url, Inlinks〉进行存储,其中InlinksURL列 表和锚文本数据。注意,这些信息在网页数据收集阶段并不是立刻可见 的,但是可以获取反向信息,就是这个页面的“出链接”(outlink)信息。链 接信息的互反操作是通过一个MapReduce作业完成的,相关详情可参见后文。

3.分段

在Nutch定义中,“分段”(segment)指的是爬取和解析一组URL。图16-5 展示了分段的创建和处理过程。一个分段(对应文件系统里的一个目录)包含以下几个部分(它们只不过是一 些包含 MapFileOutputFormat 或 SequenceFileOutputFormat 格式数据 的子目录)

• content content包食下载页面的原始数据,存储为map文件,格 式是<url, Content〉。为了展示缓存页的视图,这里使用map文 件存储数据从而支持Nutch对文件的快速随机访问。

• crawl_generate 它包含将要爬取的URL列表以及从CrawlDb取 到的与这些URL页相关的页面状态信息,对应的顺序文件格式是 <url, CrawlDatum>。这个数据采用顺序文件存储,原因有二: 第一,这些数据是按顺序逐个处理的;第二,我们不能满足map 文件排序键值的不变性要求。我们需要尽量分散属于同一台主机的 URL,以此减少每个目标主机的负载,这就意味着记录信息基本上是随机排列的。

 image.png

图16-5.分段

• crawl_fetch 它包含数据爬取的状态信息,即爬取是否成功,响应码是类别,等等。这个数据以<url, CrawlDatum>格式。存储 在map文件里。

• rawl_parse毎个成功爬取并被解析的页面的出链接列表都保存在这里,因此Nutch通过学习新的URL可以扩展它的爬取前端页 范围。

• parse_data 解析过程中收集的元数据,其中还有页面的出链接(outlinks)列表。这些信息对于后面介绍的建立反向图(入链接, inlink方向图)是相当关键的。

• parsejext页面的纯文本内容适合用Lucene进行索引。这些纯 文本存储成map文件,格式是<111, ParseText>,因此要展示搜 索结果列表的概要信息(摘要)的时候,Nutch可以快速地访问这些文件。

Generator工具(16-5中编号1)运行的时候,CrawlDb里面的数据就会产生一些新的分段,并且开始只包括要爬取的URL列表(crawl_generat下 的子目录)。当这个列表经过几个步骤的处理之后,该分段程序就从处理工具那里收集输出数据并存放在一系列的子目录里面。

例如,content从Fetecher工具(2)接收数据,这个工具根据FetecherURL 列表下载网页原始数据。这个工具也把URL的状态信息存储在里面,因此这些数据后来可以用于更新CrawlDb的页面状态信息。

在分段模块中的其他小模块接收来自Parse分段工具(3)的数据,这个工具读入网页内容,然后基于声明的(或检测到的)MIME类型,选择合适的内容解析器,最后把解析结果存为三部分:和然后这些数据被用于更新CrawlDb(4)和创建LinkDb(5)

这些分段数据一直保留到它们包含的所有数据都过期为止。Nutch采用的是 可配置的最大时间限制的方法,当页面保存的时间段超过这个时间限制 后,这个页面会被强制进行重新获取;这将有助于操作员淘汰所有过期的 分段数据(因为操作员能肯定超过这个时间限制之后,这个分段里面的所有页面都已经被重新爬取)

分段数据用来创建Lucene索引(主要是parse_text和parse_data部分的数据,图中编号6),但是它也提供一种数据存储机制来支持对纯文本数据和原始内容数据的快速检索。当Nutch产生摘要信息的时候(和査询最匹配的 文档文本片段),需要纯文本数据;原始数据提供了展现页面的缓存视图的能力。这两种用例下,或是要求产生摘要信息或是要求展现缓存页面,都是直接从map文件获取数据。实际上,即使是针对大规模数据,直接从 map文件访问数据的效率已经足够满足性能方面的要求。

转载请注明:全栈大数据 » 16.3.2数据结构

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址