1 MapReduce概述
1.1 MapReduce定义
MapReduce
是一个分布式运算程序的编程框架
,是用户开发“基于Hadoop的数据分析应用”
的核心框架。MapReduce
核心功能是将用户编写的业务逻辑代码
和自带默认组件
整合成一个完整的分布式运算程序,并发运行
在一个Hadoop集群
上
1.2 MapReduce优缺点
1.2.1 MapReduce优缺点
1、MapReduce
易于编程
它简单的实现一些接口
,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上
运行。也就是说你写一个分布式程序,跟写—个简单的串行程序是一模一样的。就是因为这个特点使得MapReduce
编程变得非常流行
2、良好的扩展性
当你的计算资源不能得到满足的时候,你可以通过简单的增加机器来扩展它的计算能力
3、高容错性
MapReduce
设计的初衷就是使程序能够部署在廉价的PC机器
上,这就要求它具有很高的容错性。比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与
,而完全是由Hadoop
内部完成的
4、适合PB级以上海量数据的离线处理
可以实现上千台服务器集群并发工作,提供数据处理能力
适用于离线处理,也就是对时间没有要求,只要得到最终的结果即可,与之相对的是实时处理
1.2.2 MapReduce的缺点
1、不擅长实时计算
MapReduce
无法像MySQL
一样,在毫秒
或者秒级
内返回结果
2、不擅长流式计算
流式计算
的输入数据是动态的
,而MapReduce
的输入数据集是静态的
,不能动态变化。这是因为MapReduce
自身的设计特点决定了数据源必须是静态
的
3、不擅长DAG(有向图)
计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出。在这种情况下,MapReduce
并不是不能做,而是使用后,每个MapReduce作业
的输出结果都会写入到磁盘,会造成大量的磁盘IO
,导致性能非常的低下
3 MapReduce核心思想
下边以一个需求为例子进行解释:统计文件中规定单词数,并且将a-p
开头的单词存放到一个文件,q-z
开头的单词存放到一个文件中
1、MapReduce
阶段分为两个阶段:Map阶段
和Reduce阶段
,也就是分发数据
和合并结果阶段
2、如下图为Map阶段
,其中输入两个文件,一个文件200MB
,另一个文件是100MB
,分别是如图大的橙色快
和灰色块
(里边的内容就是单词)。200MB
的文件被切片
成128MB
和72MB
分发,而100MB
则完整分发到一个MapReduce
处理程序中
上述文件切片是一个逻辑的切片,例如上述
200MB
的文件中切片为128MB
的部分,事实上传递过去还是整个文件
,但是通过指针只获取从0~128MB
这部分的数据,而并没有实际将文件进行切割
。默认情况下切片的大小是设置的块的大小
3、每个切片都要单独
去计算,并为其启用MapTask
进行处理,而被不同MapTask
是完全并行处理
的,互不干扰
4、MapTask
处理过程如下
- 读数据,并
按行处理
- 按
空格
切分行内单词 KV
键值对(单词,1)- 将所有的
KV键值对
中的单词,按照单词首字母,分成2个分区
溢写到磁盘(分区结果就是按照首字母不同的单词放到磁盘中不同的分区内,这是相当于将单词处理到不同文件的上一个步骤)
5、每个MapTask
任务都会将对应的输入数据处理到两个分区,如下分区1
和分区2
。然后进入Reduce阶段
的并发ReduceTask
,ReduceTask
完全互不相干,但是他们的数据依赖于上—个阶段
的所有MapTask
并发实例的输出,这里启用了两个ReduceTask
,分别对应处理统计a-p
开头的单词,他依赖的数据是3
个MapTask
处理后的分区1
的数据,另外一个则是处理所有的分区2
的数据
6、ReduceTask
阶段的处理结果输出到对应的文件中
MapReduce
编程模型只能
包含一个Map阶段
和一个Reduce阶段
,如果用户的业务逻辑非常复杂,那就只能多个MapReduce
程序,串行运行
,也就是一个MapReduce
程序在一个Map
阶段中处理不完数据,那么他只能提交给下一个MapReduce
数据,而进行多个Map
阶段知道数据处理完整,而提交到下一个MapReduce
阶段是在上一个MapReduce
处理完的基础上的,所以是串行的
4 MapReduce进程
一个完整的MapReduce程序在分布式运行时有三类实例进程
:
MrAppMaster
:负责整个程序的过程调度及状态协调。当作业放到yarn
上的时候就由它进行管理。MapTask
:负责Map阶段
的整个数据处理流程ReduceTask
:负责Reduce阶段
的整个数据处理流程
对于一个MapReduce程序中,只有一个
MrAppMaster
,整个程序由它调度。而对于MapTask
和ReduceTask
可以有多个,并且Reduce过程
也可以没有
,取决于你的业务逻辑