文章目录
- MapReduce概述
- 一、MapReduce定义
- 二、MapReduce 优缺点
- 1、MapReduce 优点
- (1)、MapReduce 易于编程
- (2)、良好的扩展性
- (3)、高容错性
- (4)、适合PB级以上的海量数据的离线处理
- 2、MapReduce 缺点
- (1)、不擅长实时计算
- (2)、不擅长流式计算
- (3)、不擅长DAG(有向图)计算
- 三、MapReduce 核心编程思想
- 1、Map阶段
- 2、Reduce 阶段
- 3、若干细节问题
- 四、MapReduce 进程
- 五、官方WordCount源码
- 六、常用序列化类型
- 七、MapReduce 编程规范
- 1、Mapper阶段
- 2、Reduce 阶段
- 3、Driver 阶段
MapReduce概述
一、MapReduce定义
-
MapReduce
是一个分布式运算程序的编程框架,是用户开发"基于Hadoop"的数据分析应用的核心框架 -
MapReduce
核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop
集群上
二、MapReduce 优缺点
1、MapReduce 优点
(1)、MapReduce 易于编程
它简单的实现一些接口,就可以完成一个分布式程序,这个分布式程序可以分布到大量廉价的PC机器上运行,也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的,因为这个特点使得MapReduce编程变得非常流行
(2)、良好的扩展性
当你的计算资源不能得到满足的时候,你可以通过简单的增加机器
来扩展它的计算能力
(3)、高容错性
MapReduce设计的初衷就是使程序能够布置在廉价的PC机器上,这就要求它具有很高的容错性,比如其中一台机器挂了,它可以把上面的计算任务转移到另外一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全由Hadoop内部完成的
(4)、适合PB级以上的海量数据的离线处理
可以实现上千台服务器集群并发工作,提供数据处理能力
2、MapReduce 缺点
(1)、不擅长实时计算
MapReduce 无法像MySQL一样,在毫秒或者秒级内返回结果
(2)、不擅长流式计算
流式计算的输入数据是动态的,而MapReduce的输入数据集是静态的,不能动态变化,这是因为MapReduce自身的设计特点决定了数据源必须是静态的
(3)、不擅长DAG(有向图)计算
多个应用程序存在依赖关系,后一个应用程序的输入为前一个的输出,在这种情况下,MapReduce并不是不能做,而是使用后,每个MapReduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常的低下
三、MapReduce 核心编程思想
1、Map阶段
-
MapReduce
运算程序一般需要分成两个阶段:Map
阶段和Reduce
阶段 -
Map
阶段的并发MapTask
,完全并发运行,互不相干
MapReduce
默认一个文件的大小是128MB
,要是超出了就会分成一个一个的块,这里将这个文件分为了三个块,将块分好之后,就会启动相应的进程,MapTask
,它运行MapTask是怎么读取数据的呢,它不是一下全部读进去,它是按行进行读取的,按空格切分行内的单词,看具体是什么,比如看下面这个流程图,Spark Hive
他中间有空格那么就按照空格切分行内的单词
,如果中间是制表符,那么就用\t
来切割,看具体的情况。然后切割完成之后它就形成单词了,KV键值对(单词,1)
,比如下面这个流程图 <spark,1>,<Hive,1> 就切成这种形式了,一个单词出现了几次的键值对。然后要进行分区,方便Reduce阶段好进行统计,三个文件块,每个文件块都分为两个区,一个区是a-p开头的单词,一个区是q-z开头的单词
2、Reduce 阶段
Reduce 阶段的数据都来源于,Map阶段
- Reduce 阶段的并发Reduce Task,完全互不相干,但是他们的数据依赖于上一个阶段的所有 MapTask 并发示例的输出
- MapReduce编程模型只能包含一个Map阶段和一个Reduce阶段,如果用户的业务逻辑非常复杂,那就只能多个MapReduce程序,串行运行
3、若干细节问题
当理清Map阶段和Reduce阶段
流程分别要做的事情之后,还需要处理以下的问题:
- MapTask 是如何运行
- ReduceTask如何工作
- MapTask如何控制分区排序等
- MapTask和ReduceTask之间如何衔接
四、MapReduce 进程
运行一个MapReduce程序需要开启几个进程? 下面这三个类需要我们启动
一个完整的MapReduce程序在分布式运行时有三类实例进程:
- MrAppMaster:负责整个程序的过程调度及状态协调
- MapTask:负责Map阶段的整个数据处理流程
- ReduceTask:负责Reduce阶段的整个数据处理流程
五、官方WordCount源码
采用反编译工具编译源码,发现WordCount案例有Map类,Reduce类和Driver驱动类,且数据的类型是Hadoop自身封装的序列化类型
六、常用序列化类型
常用的数据类型对应的Hadoop数据序列化类型
Java 类型 | Hadoop Writable类型 |
boolean | BoolenWritable |
byte | ByteWritable |
int | IntWritable |
float | FloatWritable |
long | LongWritable |
double | DoubleWritable |
String | Text |
map | MapWritable |
array | ArrayWritable |
七、MapReduce 编程规范
这些步骤基本上都是固定的,有一个套路
用户编写的程序分为三个部分:Mapper、Reduce、和Driver
1、Mapper阶段
(1) 用户自定义的Mapper要继承自己的父类
(2) Mapper的
输入数据是KV键值对
的形式(KV的形式可自定义)
(3) Mapper
中的业务逻辑写在map()
方法中
(4) Mapper的输出数据是KV对的形式(KV的类型可自定义)
(5) map()
方法(MaspTask进程) 对每一个<K,V>
只调用一次
2、Reduce 阶段
(1) 用户自定义的Reduce
要继承自己的父类
(2) Reduce的输入数据类型对应Mapper的输出数据类型
,也是KV
(3) Reduce 的业务逻辑写在reduce() 方法中
根据自己需求重写这个方法
(4) ReduceTask 进程
对每一组相同k的<K,V> 组调用一次reduce()
方法
3、Driver 阶段
相当于YARN集群的客户端,用于提交我们整个程序到YARN集群
,提交的是封装了MapReduce
程序相关运行参数的job对象