MapReduce经典案例-倒排索引
一、案例分析
1.倒排索引介绍
倒排索引是文档检索系统中最常用的数据结构,被广泛应用于全文搜索引擎。倒排索引主要用来存储某个单词(或词组)住一组文档中的存储位置的映射,提供了可以根据内容来查找文档的方式,而不是根据文档来确定内容,因此称为倒排索引(Inverted Index)。带有倒排索引的文件称为倒排索引文件,简称倒排文件(Inverted File)。
通常情况下,倒排文件由一个单词(或词组)和相关联的文档列表组成。如图所示。
从图可以看出,建立倒排索引的目的是为了更加方便地搜索。例如,单词1出现在文档1、文档4、文档13等文档中;单词2出现在文档2、文档6、文档10等文档中;而单词3出现住文档3、文档7等文档中。
在实际应用中,还需要给每个文档添加一个权值,用来指出每个文档与搜索内容的相关度,最常用的是使用词频作为权重,即记录单词或词组在文档中出现的次数。用户在搜索相关文档时,就会把权重高的推荐给客户。
下面以英文单词倒排索引为例。
上图可以看出,加权倒排索引文件中,每一行内容对每一个单词进行了加权索引,统计出单词出现的文档和次数。例如索引文件中的笫一行,表示“Hadoop”这个单词在文本filel.txt中出现过1次,在file4.txt中出现过2次,在filel3.txt中出现过1次。
2.案例需求及分析
-
现假设有3个源文件filel.txt、file2.txt和file3.txt.需要使用倒排索引的方式对这3个源文件内容实现倒排索引,并将最后的倒排索引文件输出,整个过程要求实现如下转换。
接下来,根据上面案例的需求结合倒排索引的实现,对该倒排索引案例的实现进行分析,具体如下:
(1) 首先使用默认的TextlnputFormat类对每个输入文件进行处理,得到文本中每行的偏移量及其内容,Map过程中先分析输人的<key,value>键值对,经过处理可以得到倒排索引中需要的3个信息:单词、文档名称和词频。
从图可以看出,在不使用Hadoop 自定义数据类型的悄况下,需要根据情况将单词与文档名称拼接为一个key(如"MapReduce:filel. txt").将词频作为一个value。
(2) 经过Map阶段数据转换后,同一个文档中相同的单词会出现多个的情况,而单纯依靠后续Reduce阶段无法同时完成词频统计和生成文档列表,所以必须增加一个Combine阶段,先完成每一个文档的词频统计。如图所示。
从图可以看出,在Reduce阶段,根据前面的分析先完成每一个文档的词频统计,然后又对输入的<key,value>键值对进行了重新拆装,将单词作为key,文档名称和词频组成一个value (如“filel.txt:l”)。这是因为,如果直接将词频统计后的的输出数据(如“MapReduce:filel.txt ”)作为下一阶段Reduce过程的输入,那么在Shuffle过程时将面临一个问题:所有具有相同单词的记录应交由同一个Reducer处理,但当前的key值无法保证这一点,所以对key值和value值进行重新拆装。这样做的好处是可以利用MapReduce框架默认的HashPartilioncr类完成Shuffle过程,将相同单词的所有记录发送给同一个Reducer进行处理。
(3)经过上述两个阶段的处理,Reduce阶段只需将所有文件中相同key值的value值进行统计,并组合成倒排索引文件所需的格式即可,如图所示。
从图可以看出,在Reduce阶段会根据所有文档中相同key进行统计,同时在处理过程中结合倒排索引文件的格式需求就可以生成对应的文件。
二、案例实现
在完成对倒排索引的相关介绍以及案例实现的具体分析后,接下来通过前面说明的案例分析步骤来实现具体的倒排索引。具体实现步骤如下。
1. Map阶段实现
打开之前创建的Maven项目 HadoopDemo,并新创建com.njci.mr.invertedlndex包,在该路径下编写自定义 Mapper 类 InvertedlndexMapper。
代码的作用是将文本中的单词按照空格进行切割,并以冒号拼接,“单词:文档名称”作为key,单词次敎作为value,都以文本方式输出至Combine阶段。
2. Combine阶段实现
根据Map阶段的输出结果形式.在com.njci.mr.Invertedlndex包下,自定义实现Combine阶段的类InvertedlndexCombiner.对每个文档的单词进行词频统计。
代码的作用是对Map阶段的单词次数聚合处理,并直新设置key值为单词,value值由文档名称和词频组成。
3. Reduce阶段实现
根据Combine阶段的输出结果形式,同样在com.njci.mr.Invertedlndex包下自定义 Reducer 类 InvertedlndexMapper。
代码的作用是,接收Combine阶段输出的数据,并最终案例倒排索引文件需求的样式,将单词作为key,多个文档名称和词频连接作为value,输出到目标目录。
4. Driver程序主类实现
编写MapReduce程序运行主类InvertedlndexDriver.java。
以上代码的作用是设置MapReduce工作任务的相关参数。由于本次演示的数据量较小。为了方便、快速进行案例演示,本案例采用了本地运行模式,对指定的本地D:\Inverledlndex\input 目录下的源文件(需耍提前准备)实现倒排索引,并将结果输入到本地D:\lnvertedlndex\output目录下,设置完毕后,运行程序即可。
5. 效果测试
现在本地D:\Inverledlndex\input 目录下创建 filel.txt、file2.txt 和 file3.txt。内容如之前所示。
接着执行MapReduce程序的程序入口 InvertedlndexDriver类,正常执行完成后,会在指定的D:\lnvertcdlndex\output下生成结果文件。