本发明涉及的是一种分布式计算方法,具体涉及一种基于MapReduce的Map端数据的聚合方法。
背景技术:
当前处理大数据应用问题时,比较重要的两个思想:并行和分治。通过将大规模的数据合理的拆分成多个小部分,通过并行思想和分治思想相结合的计算方法,使得问题得到的相对满意的解决。MapReduce为我们提供了一种有效、快速的并行编程框架。
MapReduce实现了两个主要功能:Map和Reduce。Map是把一个函数应用于集合中的所有成员,然后返回一个基于这个处理的结果集。Reduce是把两个或更多个Map中一些结果,通过多个线程、进程或者独立系统并行处理的结果集进行分类和归纳。
在MapReduce模型中,用户需要定义Map和Reduce函数,输入是一个键值对列表,键值对是由键和值组成的二元组(Key,Value),排序和分组都是基于Key。Map函数的输入时键值对,对每个键值对进行计算,产生的结果也是中间键值对列表。在Map和Reduce中间这个键值列表,基于键进行聚集。Reduce函数的输入是基于键的键值对分组,其中每个分组都是独立的,这样就可以使用分布式大规模并行的方式进行处理,总输入能远大MapReduce的结点的内存。
然而在真正的处理方面,处理的速度并不是和所投入的资源成正比的,比如:用2台主机处理数据的效率并不会比用1台主机的提高1倍。而是少于1;因为大数据处理过程中,如何将数据从产生端(Map的输出)传输到使用端(Reduce输入)是一个很重要的问题。因为传输一般会涉及I/O操作以及网络传输,而两者都相对耗时。Hadoop中,中间结果一般先写回磁盘,然后在通过网络传输给Reduce端。所以,提高算法运行效率,减少通信量,Map端需要尽可能少的结果。
为了解决Map端计算结果中的键值对过多的问题,一种方法是引入Combine组件,将中间结果聚合,相当于做了一小的Reduce。但这样做将会进行两次I/O,因为Map计算完后会立刻写入磁盘,然后将磁盘中数据读出来进行的使用Combine来聚合。
另一种方法将Map端计算结果中的键值对在内存中聚合,一次计算,一次I/O。这种方法的优点是速度快。内聚合要求Map端的Map函数中的算法在内存中保留计算的中间结果。但不是所有的算法都是适用于将计算结果在内存中聚合,因为在内存中的聚合操作在计算的过程中进行的,对于与数据的输入顺序有关的算法,如果使用内聚合,最终的计算结果可能和外聚合的结果不同,所以,在内聚合前需要进行验证Map函数中算法是否能够进行内聚合。
综上所述,目前在对基于MapReduce的Map端聚合机制的研究中,内聚合即在内存中聚合,是通过编写MapReduce程序时用户自己实现的,基本方法是简单设置临时变量来存储合并Map计算后的键值对,外聚合即通过Hadoop中提供的Combine组件实现的。现存的聚合方法过于简单,在内存中不能有效的对Map计算后的键值对进行聚合,效率低。
技术实现要素:
本发明的目的在于提供一种能够解决MapReduce计算框架下Map端数据聚合方法效率低、Map端计算结果过多等问题的基于MapReduce的Map端数据的聚合方法。
本发明的目的是这样实现的:
(1)分别通过外聚合和内聚合计算出相应的结果;
(2)比较两个结果是否相同;
(3)若相同则进行内聚合,若不相同则进行外聚合;
所述内聚合具体包括:
(3.1.1)建立倒排索引:根据读入的中Key值建立倒排索引,在索引中记录,Address为在内存中的地址值;
(3.1.2)对Address建立指向Count的索引,进行匹配,将匹配成功的进行合并;
(3.1.3)在进行下次匹配之前,查看内存是否足够,如果内存不足够,将内存中Count值小的部分写回磁盘;如果内存足够查看是否还有未计算的,如果有未计算的,将未计算的调入内存进行计算并返回(3.1.1)继续执行;如果没有未计算的则结束;
所述外聚合具体包括:
(3.2.1)将调入内存进行计算,将计算结果写入磁盘,记为S;
(3.2.2)将磁盘中的S重新调回内存,执行内聚合的操作。
本发明的有益效果体现在:
(1)本发明通过建立倒排索引,提升检索速度的同时,使在内存中进行有效的聚合,建立索引,提升匹配速度。同时考虑到,在进行内聚合时,防止内存溢出的问题,在合并的过程中检查内存是否足够,如果内存不够,则将部分进行合并次数较少的,即Count值较小的,先写回磁盘来防止内存溢出。
(2)本发明根据数据的特点,保证计算结果正确的前提下,选择相应的聚合方式,在减少I/O的访问次数的同时;减少生成的数量,从而减少传输的通信量。
附图说明
图1为基于MapReduce的Map端数据的聚合方法的测试阶段流程图。
图2为基于MapReduce的Map端数据的聚合方法的内聚合方法流程图。
图3为基于MapReduce的Map端数据的聚合方法的外聚合方法流程图。
具体实施方式
下面结合附图举例对本发明作进一步描述。
本发明旨在解决MapReduce计算框架下Map端数据聚合方法效率低和Map端计算结果过多的问题。提出了一种基于MapReduce的Map端数据的聚合方法,在内存中对Map计算后的键值对进行有效的聚合,在确保输出结果正确的前提下,减少I/O的访问次数;同时减少生成的键值对,来减少传输的通信量。
如图1所示,该方法包括以下两个阶段,测试阶段和聚合阶段。
测试阶段:通过测试阶段来验证所使用Map端的Map函数中的算法是否适合进行内聚合。因为有些Map函数中的算法对输入数据的输入顺序敏感,可能会导致计算结果出错。而内聚合方法和外聚合方法不同之处就是数据的输入顺序的不同。内聚合方法是在内存中Map函数的计算过程中进行的,计算完一部分后就进行聚合;外聚合方法是在Map函数将所有数据计算完存入磁盘后,在调入内存进行聚合的。
聚合阶段:若测试通过,则进行内聚合,即使用内聚合方法对Map端计算后的数据进行聚合;若测试未通过,则进行外聚合,即使用外聚合方法对Map端计算的后的数据进行聚合。
两个阶段具体的步骤如下:
1.测试阶段。测试阶段的任务是测试Map端计算后的数据是否能够进行内聚合方法,具体做法是将要进行计算的部分数据通过内聚合方法和外聚合方法计算后,比较得到的结果是否相同。因为使用的数据少,所以时间测试阶段使用的时间将很短,相对于整个MapReduce的计算总时间,可以忽略不计。如图1所示,具体步骤如下:
(1)分别通过外聚合和内聚合计算出相应的结果。
(2)比较两个结果是否相同。
(3)若相同则进行内聚合,若不相同则进行外聚合。
2.聚合阶段。包括内聚合方法和外聚合方法。
(1)内聚合方法:内聚合方法的作用是将聚合操作放置到内存中进行。首先,基于对内存的中的Key建立倒排索引,即,其中Address是在内存中的地址。其次,为了在内存不足时,能够及时的将匹配次数少的部分调出内存,对Address建立匹配次数Count的索引。经过匹配后,将匹配到的进行合并。每完成一次的内聚合后,当有新的调入内存时,要对内存容量进行检查,如果内存足够,查看是否还有未计算的,如果有将未计算的,将未计算的调入内存继续计算;如果内存当前容量不足够,要将内存中Count值小的部分写回磁盘。如图2所示,具体步骤如下:
1)建立倒排索引:根据读入的中Key值建立倒排索引,在索引中记录,Address为在内存中的地址值。
2)对Address建立指向Count的索引:为了在内存不足时,能够及时的将匹配次数少的调出内存,对Address建立匹配次数Count的索引。
进行匹配,将匹配成功的进行合并。
3)在进行下次匹配之前,查看内存是否足够,如果内存不足够,将内存中Count值小的部分写回磁盘;如果内存足够查看是否还有未计算的,如果有未计算的,将未计算的调入内存进行计算并返回1)继续执行;如果没有未计算的则结束。
(2)外聚合方法:外聚合模块的作用是将聚合操作放在Map端的Map函数计算完成后统一进行。如3所示,具体步骤如下:
1)将调入内存进行计算,将计算结果写入磁盘。记为S。
2)将磁盘中的S重新调回内存,执行内聚合的操作。
具体实例为:将1000个随机分成10份,平均每个Map端进行100个的相关计算,使用传统的方法则每个Map端需要2次I/O的访问,即一共需要20次I/O访问,使用改进的方法则每个Map端在最好情况下,只需要1次I/O的访问,即一共需要10次I/O访问。虽然部分情况是需要2次I/O的访问,但总体的I/O的平均访问次数为15次。同时在只需要1次访问I/O的情况下,可以节省1次所有在内存中装载和卸载时所耗费的时间,系统的整体性能可以得到进一步提升。