1.前言

        学习hadoop的童鞋,倒排索引这个算法还是挺重要的。这是以后展开工作的基础。首先,我们来认识下什么是倒排索引:

        倒排索引简单地就是:根据单词,返回它在哪个文件中出现过,而且频率是多少的结果。这就像百度里的搜索,你输入一个关键字,那么百度引擎就迅速的在它的服务器里找到有该关键字的文件,并根据频率和其他一些策略(如页面点击投票率)等来给你返回结果。这个过程中,倒排索引就起到很关键的作用。

2.MapReduce框架简介

        要设计倒排索引这个算法,那么我们首先得知道MapReduce框架中的InputFormat类,Mapper类,Partition过程,sort过程,Combine类,Reduce类的设计原理。

2.1InputFormat类

        InputFormat类的作用是什么呢?其实就是把输入的数据(就是你上传到hdfs的文件)切分成一个个的split,然后将split分拆成<key,value>对做为map函数的输入。hadoop里默认使用TextInputFormat类处理输入(这个类只处理文本文件)。TextInputFormat类将文本文件的多行分割成多个split,并通过LineRecorderReader将其中的每一行解析成<key,value>对,key为该行在文本中的偏移量,value值为这一行的内容。例如下面一个text.txt文本,经过InputFormat类处理之后

 

mapreduce倒排索引实验步骤 mapreduce 倒排索引_云计算

  如上图text1.txt文档,经过InputFormat处理之后,形成了3个<key,value>对,这3对之中,第一对中key=0,是因为hello单词位于文本头。第二对中key=31,是因为下一行的首单词if相对整个文本,它位于31的位置。类似第三对也如此。您可以自己数下并知道。

        这3个<key,value>对做为map函数的输入,然后你可以根据需要在对输入的<key,value>对进行处理。

 

 

2.2Mapper类

       实现map函数,根据输入的<key,value>对生成中间结果。这里以wordcount例子来说,对于上面的text.txt文档经过InputFormat处理之后,上面3对<key,value>对输入map之后,输出过程如下:

 


mapreduce倒排索引实验步骤 mapreduce 倒排索引_mapreduce_02

                                   图2 map处理过程

2.3Partition过程

       Partition就是分区。为什么要分区呢?因为大多时候有多个Reducer,分区的作用就是对map的输出,redcue的输入进行预处理。最重要的就是处理到在输入reduce的数据,保证同一个key值被分到同一个reduce。MapReduce程序中,Partition决定Map节点的输出将分区到那个Reduce节点上。默认是使用HashPartition,根据key值进行Hash操作。

 

mapreduce倒排索引实验步骤 mapreduce 倒排索引_文本文件_03

                                           

                                   图3 Partition分区过程

仔细观察Partition分区过程,text1.txt和text2.txt的partition1分区中有相同的key。这就是分区的效果,把相同的key放在同一个分区里。

2.4 sort过程

      sort过程就是把键值对按照key值的首字母进行排序。

 

mapreduce倒排索引实验步骤 mapreduce 倒排索引_mapreduce倒排索引实验步骤_04

 

2.5 Combin类

       Combine过程是Mapper的一部分,在map函数之后执行。实现combine函数,合并中间结果具有相同key值的键值对。

 

mapreduce倒排索引实验步骤 mapreduce 倒排索引_mapreduce_05

2.6 Reduce类

       reduce过程是整合的过程,当然像wordcount的例子,我们只需要统计单词个数而已,只需一个简单的统计循环。

 

mapreduce倒排索引实验步骤 mapreduce 倒排索引_倒排索引_06