首先MapReduce很明显是分为Map阶段和Reduce阶段。两个阶段分别做什么呢?
小编自己画了个图,大家共勉一下
图中1-2过程为map过程,3为Reduce过程,接下来看一张专业图片,两张对比一起看
在整个mapReduce过程包含很多复杂的处理过程,而我们要学习的就是其中几个过程包含,Split过程、Partitione过程还有Shuffle过程,举一个实例的话
假设我们手上有很多复杂数据,那么怎样来处理呢? 第一步就是分类,把数据分类。 分类后的数据就不复杂了,这就是异而化同。 分类之后数据还是很多,怎么办呢? 第二步,分割。 分割就是把数据切分成小块, 这样就可以并发或者批量处理了, 这就是大而化小。
回到 map-reduce概念上, map的工作就是切分数据,然后给他们分类,分类的方式就是输出key,value对,key就是对应“类别”了。 分类之后,reducer拿到的都是同类数据,这样处理就很容易了。
大数据一般采用的HDFS 解决了大数据存储的问题,那么 MapReduce 自然要解决的是数据计算问题在处理大数据计算中,一台机器是无法满足大批量数据计算的,这个时候就需要使用MapReduce,MapReduce是一种编程模型,用于大规模数据集的并行计算,需要将数据分配到大量的机器上计算,每台机器运行一个子计算任务,最后再合并每台机器运算结果并输出。 MapReduce 的思想就是 『分而治之』
MapReduce 将整个并行计算过程抽象到两个函数,在 Map 中进行数据的读取和预处理,之后将预处理的结果发送到 Reduce 中进行合并。一个简单的 MapReduce 程序只需要指定 map()、reduce()、 input 和output,剩下的事由框架完成。
Map ( 映射 ) : 对一些独立元素组成的列表的每一个元素进行指定的操作,可以高度并行。
Reduce( 化简 ) : 对一个列表的元素进行合并。
MapReduce执行流程
以经典的 WordCount 的例子来说明一下MapReduce的执行流程,WordCount就是统计每个单词出现的次数。
MapReduce计算框架的一般流程有以下几个步骤:
输入 ( Input ) 和拆分 ( Split ):
对数据进行分片处理。将源文件内容分片成一系列的 InputSplit,每个 InputSplit 存储着对应分片的数据信息,记住是对文件内容进行分片,并不是将源文件拆分成多个小文件。
迭代 ( iteration ):
遍历输入数据,并将之解析成 key/value 对。拆分数据片经过格式化成键值对的格式,其中 key 为偏移量,value 是每一行的内容,这一步由MapReduce框架自动完成。
映射 ( Map ):
将输入 key/value 对映射 ( map ) 成另外一些 key/value 对。MapReduce 开始在机器上执行 map 程序,map 程序的具体实现由我们自己定义,对输入的 key/value 进行处理,输出新的 key/value,这也是hadoop 并行事实发挥作用的地方。
洗牌 ( Shuffer ) 过程:
依据 key 对中间数据进行分组 ( grouping )。这是一个洗牌的过程,得到map方法输出的 对后,Mapper 会将它们按照 key 值进行处理,这包括 sort (排序)、combiner (合并)、partition (分片) 等操作达到排序分组和均衡分配,得到 Mapper 的最终输出结果交给 Reducer。mapper 和 reducer 一般不在一个节点上,这就导致了reducer 需要从不同的节点上下载数据,经过处理后才能交给 reducer 处理。
归并( Reduce ):
以组为单位对数据进行归约 ( reduce )。Reducer 先对从 Mapper 接收的数据进行排序,再交由用户自定义的 reduce方法进行处理。
迭代:
将最终产生的 key/value 对保存到输出文件中。得到新的 对,保存到输出文件中,即保存在 HDFS 中。