大数据之hadoop分布式计算框架MapReduce
一、MapReduce构成
MapReduce分为两部分,即map和reduce。
其中map是入队(key,value),reduce则是聚合(计算)。
map过程的输出时reduce过程的输入。
需要注意的是这里map中的key是可以重复的,reduce做聚合的时候可以把相同的key放到同一组里,做聚合运算。
二、MapReduce原理分析
map过程:
上图左侧是map的task,其中一个split可以可看成一个maptask(jvm进程),那么多个jvm进程就可以在集群中分发到各个服务节点上计算,实现并行计算。
split是数据切割的过程,切割的结果输出给map,默认情况下切割是以行为单位的。每读一行调用一次map方法。(切割是可以人为干预的,可以依次切割多行,也可以一次只切割一个单词)
map则是用来设置键值对,在这里可以参考关系型数据库中每一行数据中的每个值都有对应的字段,key即字段,值即value。这里map的key要灵活应用,按照mapreduce的原语来定义,利用其特性。
split是读数据,map是根据需求加工数据。
Map计算完成后会生成一个文件存储在本机的磁盘中。磁盘中直接建立好分区索引,reduce读取的时候可以直接重分区中读取。之所以采用分区是因为若每生成一组键值对就要用io向磁盘输出内容,这样会导致io频率过大,影响效率,所以这里用了一个内存缓冲区,将生成的键值对先放到缓冲区里,在放置的过程同时做了按key排序(在内存中做排序效率很高)。当数据达到定量的标准就会产生一次溢写io,将内容写到磁盘生成一个文件,这样能大大减少了与磁盘交互的频率,提升了整体计算的效率。
reduce过程
reduce是根据加工好的数据来计算数据。
由于map的过程中已经做了排序,那么reduce在读取数据的时候key已经是有序的了,reduce读取数据的时候将相同的key放在一组(因为有序,所以在分区里只要找到相同的key效率很高,不用做全文检索。)
然后reduce对key相同的键值对进行计算,得出我们想要的结果。
最后将结果写入hdfs指定的输出路径或者写入数据库。
三、MapReduce简单案例
这是一个典型的wordcount案例,就是计算单词重复的次数。
第一步,split切片,这里定义了三个分区,这样有三个节点并行做map计算,将整个文档切成三行输入到map,map的key为单词,value为1
第二步,map输出到reduce中间会有一个suffer拉取的过程,这个过程中的分组时通过对不同key进行哈希取模,将取模相同的值分到一组。(这个步骤就是初步划分一下)
第三步,reduce的时候将相同的key放到一组,也就把相同的单词放到一个分区,每个分区调用一次reduce方法。
第四步,将key输出,将value累加,就得出了word count的值了。