1. MapReduce
介绍
MapReduce
思想在生活中处处可见。或多或少都曾接触过这种思想。
MapReduce
的思
想核心是
“
分而治之
”
,适用于大量复杂的任务处理场景(大规模数据处理场景)。
Map
负责
“
分
”
,即把复杂的任务分解为若干个
“
简单的任务
”
来并行处理。可以进行拆
分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
Reduce
负责
“
合
”
,即对
map
阶段的结果进行全局汇总。
MapReduce
运行在
yarn
集群
1. ResourceManager
2. NodeManager
这两个阶段合起来正是
MapReduce
思想的体现。
还有一个比较形象的语言解释
MapReduce:
我们要数图书馆中的所有书。你数
1
号书架,我数
2
号书架。这就是
“Map”
。我们人越多,
数书就更快。
现在我们到一起,把所有人的统计数加在一起。这就是
“Reduce”
。
1.1. MapReduce
设计构思和框架结构
MapReduce
是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码
和自带默认组件整合成一个完整的分布式运算程序,并发运行在
Hadoop
集群上。
既然是做计算的框架,那么表现形式就是有个输入(
input
),
MapReduce
操作这个输
入(
input
),通过本身定义好的计算模型,得到一个输出(
output
)。
Hadoop MapReduce
构思
:
分而治之
对相互间不具有计算依赖关系的大数据,实现并行最自然的办法就是采取分而治
之的策略。并行计算的第一个重要问题是如何划分计算任务或者计算数据以便对
划分的子任务或数据块同时进行计算。不可分拆的计算任务或相互间有依赖关系
的数据无法进行并行计算!
统一构架,隐藏系统层细节
如何提供统一的计算框架,如果没有统一封装底层细节,那么程序员则需要
考虑诸如数据存储、划分、分发、结果收集、错误恢复等诸多细节;为此,
MapReduce
设计并提供了统一的计算框架,为程序员隐藏了绝大多数系统
层面的处理细节。
MapReduce
最大的亮点在于通过抽象模型和计算框架把需要做什么
(what
need to do)
与具体怎么做
(how to do)
分开了,为程序员提供一个抽象和高
层的编程接口和框架。程序员仅需要关心其应用层的具体计算问题,仅需编
写少量的处理应用本身计算问题的程序代码。如何具体完成这个并行计算任
务所相关的诸多系统层细节被隐藏起来
,
交给计算框架去处理:从分布代码的
执行,到大到数千小到单个节点集群的自动调度使用。
构建抽象模型:
Map
和
Reduce
MapReduce
借鉴了函数式语言中的思想,用
Map
和
Reduce
两个函数提供了高层
的并行编程抽象模型
Map:
对一组数据元素进行某种重复式的处理;
Reduce:
对
Map
的中间结果进行某种进一步的结果整理。
Map
和
Reduce
为程序员提供了一个清晰的操作接口抽象描述。
MapReduce
处理的数据类型是键值对。
MapReduce
中定义了如下的
Map
和
Reduce
两个抽象的编程接口,由用户去编程
实现
:
Map:
(k1; v1) → [(k2; v2)]
Reduce:
(k2; [v2]) → [(k3; v3)]
MapReduce
框架结构
一个完整的
mapreduce
程序在分布式运行时有三类实例进程:
1.
MRAppMaster
负责整个程序的过程调度及状态协调
2.
MapTask
负责
map
阶段的整个数据处理流程
3.
ReduceTask
负责
reduce
阶段的整个数据处理流程
2. MapReduce
编程规范
MapReduce
的开发一共有八个步骤
,
其中
Map
阶段分为
2
个步骤,
Shuffle
阶段
4
个步骤,
Reduce
阶段分为
2
个步骤
Map
阶段
2
个步骤
1.
设置
InputFormat
类
,
将数据切分为
Key-Value
(K1
和
V1)
对
,
输入到第二步
2.
自定义
Map
逻辑
,
将第一步的结果转换成另外的
Key-Value
(
K2
和
V2
) 对
,
输出结
果
Shuffle
阶段
4
个步骤
1.
对输出的
Key-Value
对进行分区
2.
对不同分区的数据按照相同的
Key
排序
3. (
可选
)
对分组过的数据初步规约
,
降低数据的网络拷贝
4.
对数据进行分组
,
相同
Key
的
Value
放入一个集合中
Reduce
阶段
2
个步骤
1.
对多个
Map
任务的结果进行排序以及合并
,
编写
Reduce
函数实现自己的逻辑
,
对输
入的
Key-Value
进行处理
,
转为新的
Key-Value
(
K3
和
V3
)输出
2.
设置
OutputFormat
处理并保存
Reduce
输出的 Key-Value
数据