今天我们一起了解下大数据计算引擎MapReduce。MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算。MapReduce的核心思想就是“分而治之”,其主要包括Map阶段和Reduce阶段。

1.MapReduce技术架构

mapreduce大数据框架(大数据技术之MapReduce)(1)

图 1 HDFS技术架构

(1)Map阶段负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理。“简单的任务”包含三层含义:一是数据或计算的规模相对原任务要大大缩小;二是就近计算原则,即任务会分配到存放着所需数据的节点上进行计算;三是这些小任务可以并行计算,彼此间几乎没有依赖关系。

(2)Reduce阶段负责对map阶段的结果进行汇总。至于需要多少个Reduce,用户可以根据具体问题,通过在mapred-site.xml配置文件里设置参数mapred.reduce.tasks的值,默认值为1。

2.MapReduce的工作原理

mapreduce大数据框架(大数据技术之MapReduce)(2)

图 2 MapReduce的工作原理

从最上方的user program开始执行程序,user program链接了MapReduce库,实现了最基本的Map函数和Reduce函数。执行的顺序如下:

1)MapReduce库先把user program的输入文件划分为M份(M为用户定义),每一份通常有16MB到64MB,例如分成split0~4;然后使用fork将用户进程拷贝到集群内其它机器上。

2.user program的副本中有一个称为master,其余称为worker,master是负责调度的,为空闲worker分配作业(Map作业或者Reduce作业),worker的数量也是可以由用户指定的。

3.被分配了Map作业的worker,开始读取对应分片的输入数据,Map作业数量是由M决定的,和split一一对应;Map作业从输入数据中抽取出键值对,每一个键值对都作为参数传递给map函数,map函数产生的中间键值对被缓存在内存中。

4.缓存的中间键值对会被定期写入本地磁盘,而且被分为R个区,R的大小是由用户定义的,将来每个区会对应一个Reduce作业;这些中间键值对的位置会被通报给master,master负责将信息转发给Reduce worker。

5.master通知分配了Reduce作业的worker它负责的分区在什么位置(肯定不止一个地方,每个Map作业产生的中间键值对都可能映射到所有R个不同分区),当Reduce worker把所有它负责的中间键值对都读过来后,先对它们进行排序,使得相同键的键值对聚集在一起。因为不同的键可能会映射到同一个分区也就是同一个Reduce作业,所以排序是必须的。

6.reduce worker遍历排序后的中间键值对,对于每个唯一的键,都将键与关联的值传递给reduce函数,reduce函数产生的输出会添加到这个分区的输出文件中。

7.当所有的Map和Reduce作业都完成了,master唤醒正版的user program,MapReduce函数调用返回user program的代码。

所有执行完毕后,MapReduce输出放在了R个分区的输出文件中(分别对应一个Reduce作业)。用户通常并不需要合并这R个文件,而是将其作为输入交给另一个MapReduce程序处理。整个过程中,输入数据是来自底层分布式文件系统HDFS的,中间数据是放在本地文件系统的,最终输出数据是写入底层分布式文件系统HDFS的。而且我们要注意Map/Reduce作业和map/reduce函数的区别:Map作业处理一个输入数据的分片,可能需要调用多次map函数来处理每个输入键值对;Reduce作业处理一个分区的中间键值对,期间要对每个不同的键调用一次reduce函数,Reduce作业最终也对应一个输出文件。

3.MapReduce的处理流程详解

我们以单词统计为例,分别介绍map阶段和reduce阶段的处理过程。单词统计的业务过程是统计一个文件中的每个单词出现的次数,业务过程大致如下:

mapreduce大数据框架(大数据技术之MapReduce)(3)

图 3单词统计业务过程

1.MapReduce的map阶段主要把读入的数据进行分区处理,并进行数据排序、分组,其具体流程如下:

mapreduce大数据框架(大数据技术之MapReduce)(4)

图 4map阶段数据处理过程

1)读取HDFS文件数据,按照行解析成<k,v>格式;

2)对1输出的<k,v>经过程序处理按照新的逻辑输出新的<k,v>;

3)对<k,v>进行分区处理;

4)各分区分别对输入的<k,v>进行排序,分组。

2.reduce阶段是对数据进行合并,并输出结果的过程,其处理过程主要如下:

mapreduce大数据框架(大数据技术之MapReduce)(5)

图 5 Reduce阶段处理流程

Reduce阶段主要是对map阶段的输出结果进行合并,排序处理后输出结果到HDFS上。

4.MapReduce的特点

1)MapReduce的优点

易于编程:如果要编写分布式程序,只需实现一些简单接口,与编写普通程序类似,避免了复杂过程。

良好的扩展性:当计算资源不能得到满足的时候,可以通过简单的增加机器来扩展它的计算能力。

高容错性:MapReduce程序在执行过程中如果有其中一台机器挂了,它可以把计算任务转移到另外一个正常节点上运行,而且这个过程不需要人工参与,而完全是由Hadoop内部完成的。

适合海量数据的离线处理:MapReduce由于其分布式计算的能力,因此可以实现上干台服务器集群并发工作,提供海量数据的处理能力。

2)MapReduce的缺点

不适用实时计算:由于MapReduce每次计算结果需要落地到磁盘上,会导致大量的磁盘IO操作,因此不适合做实时数据的计算。

不适合流式计算:流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化。这是因为MapReduce自身的设计特点决定了数据源必须是静态的。

不适合DAG有向图计算:因为每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常低下,因此不适合做DAG有向图计算。

5.MapReduce的应用场景

1)单词统计;

2)简单的数据统计,比如网站的PV和UV统计;

3)搜索引擎建立索引;

4)搜索引擎中,统计最流行的K个搜索词;

5)统计搜索词频率,帮助优化搜索词提示;

6)复杂数据分析算法实现。

,