目录
一、MapReduce核⼼思想
MapReduce思想在生活中处处可见。或多或少都曾接触过这种思想。MapReduce的思想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。即使是发布过论文实现分布式计算的谷歌也只是实现了这种思想,而不是自己原创。
阅读资料Hadoop的 MapReduce 核⼼技术起源于⾕歌在 2004 年发表的关于 MapReduce系统的论⽂介绍。论⽂中有这么⼀句话:Our abstraction is inspired by the map and reduce primitives present in Lisp and many other functional languages。这句话提到了 MapReduce 思想来源,⼤致意思是, MapReduce 的灵感来源于函数式语⾔(⽐如Lisp )中的内置函数 map (映射)和 reduce (规约)。简单来说,在函数式语⾔⾥,map 表示对⼀个列表( List )中的每个元素做计算reduce 表示对⼀个列表中的每个元素做迭代计算。它们具体的计算是通过传⼊的函数来实现的,map 和 reduce 提供的是计算的框架。我们想⼀下,reduce既然能做迭代计算,那就表示列表中的元素是相关的(⽐如我想对列表中的所有元素做相加求和,那么列表中⾄少都应该是数值吧)。⽽map 是对列表中每个元素做单独处理的,这表示列表中可以是杂乱⽆章的数据。这样看来,就有点联系了。在MapReduce ⾥, Map 处理的是原始数据,⾃然是杂乱⽆章的,每条数据之间互相没有关系;到了Reduce 阶段,数据是以 key 后⾯跟着若⼲个value 来组织的,这些 value 有相关性,⾄少它们都在⼀个 key 下⾯,于是就符合函数式语⾔⾥map 和 reduce 的基本思想了。
MapReduce⼀个完整的运算分为Map和Reduce两个部分
Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
Reduce负责“合”,即对map阶段的结果进行全局汇总
二、MapReduce的阶段分类
第⼀阶段
第⼀阶段,也称之为Map
阶段。这个阶段会有若⼲个
MapTask
实例,完全并⾏运⾏,互不相⼲。每个MapTask
会读取分析⼀个
InputSplit(
输⼊分⽚,简称分⽚
)
对应的原始数据。计算的结果数据会临时保存到所在节点的本地磁盘⾥。
数据扭转
该阶段的编程模型中会有⼀个map
函数需要开发⼈员重写,
map
函数的输⼊是⼀个<key,value>对
,map
函数的输出也是⼀个
<key,value>
对
,key
和
value
的类型需要开发 ⼈员指定。参考下图:
![](https://i-blog.csdnimg.cn/blog_migrate/6d09db5884804d5f174c3fe1bbd30ea4.png)
第⼆阶段
第⼆阶段,也称为Reduce
阶段。这个阶段会有若⼲个
ReduceTask
实例并发运⾏,互不相⼲。但是他们的数据依赖于上⼀个阶段的所有maptask
并发实例的输出。⼀个ReudceTask会从多个
MapTask
运⾏节点上
fetch
⾃⼰要处理的分区数据。经过处理后,输出到HDFS上。
数据扭转
该阶段的编程模型中有⼀个reduce
函数需要开发⼈员重写,
reduce
函数的输⼊也是⼀个<key
,
value>
对,
reduce
函数的输出也是⼀个
<key
,
value>
对。这⾥要强调的是,reduce
的输⼊其实就是
map
的输出,只不过
map
的输出经过
shuffle
技术后变成了<key,List>
⽽已。参考下图:
![](https://i-blog.csdnimg.cn/blog_migrate/b25d1ee44aad446774fb5852f539f481.png)
注意
:
MapReduce
编程模型只能包含⼀个
map
阶段和⼀个
reduce
阶段,如果⽤户的业务逻辑⾮常复杂,那就只能多个MapReduce
程序,串⾏运⾏。