7,MapReduce基础
平凡的神灯 人气:0
# MapReduce基础
[TOC]
### 一、关于MapReduce
#### 1.1 为什么要MapReduce
- **单机资源有限:**由于单台计算机的资源有限,计算能力不足以处理海量数据;所以需要多台计算机组成分布式集群来处理海量数据。
- **分布式计算较复杂:**在分布式计算中,计算任务的分发,各个主机之间的协作;程序的启动以及运行过程中的监控、容错、重试等都会变得很复杂。所以引入了MapReduce框架,框架解决了分布式开发中的复杂性,开发人员只需要将大部分工作集中在业务逻辑的开发上,从而极大的提高了工作效率。
#### 1.2 MapReduce的定义
- MapReduce是一个分布式运算程序的编程框架,用于大规模数据集(大于1TB)的并行计算;Map(映射)和reduce(归约)是它的主要思想;它极大地方便了编程人员在不会分布式并行编程的情况下,将自己的程序运行在分布式系统上。
### 二、MapReduce的优缺点
#### 2.1 优点:
- **易于编程:**只需要实现一些接口,就可以完成一个分布式程序的编写;跟编写一个串行程序一样;
- **良好的扩展性:**当计算资源不足时,只需要简单的增加机器来扩展它的计算能力;
- **高容错性:**当一个机器挂了之后,会自动把上面的计算任务转移到另一个节点上运行,无需人工干预;
- **海量:**适合PB级海量数据的离线处理。
#### 2.2 缺点:
- **不适合实时计算:**MapReduce由于过程较为复杂,IO次数较多,所以无法做到毫秒或秒级响应;
- **不适合流式计算:**流式计算的输入是动态的,可以不断添加,而MapReduce的输入是静态的;
- **不适合DAG(有向图)计算:**对于多个程序之间有依赖关系,即后一个程序的输入是前一个程序的输出;虽然MapReduce也可以完成,但都是通过磁盘来传递中间数据,造成大量的磁盘IO,性能极低。
### 三、MapReduce的执行阶段
![](https://img2020.cnblogs.com/blog/1201165/202003/1201165-20200314170748279-1829726130.png)
#### 3.1 执行的两个阶段
- **Map阶段:**若干个maptask并发实例,完全并行运行,互不相干。
- **Reduce阶段:**若干个reducetask并发实例,完全并行运行,但是他们的数据依赖于Map阶段的输出。
- **注意:**MapReduce模型只能包含一个map阶段和一个reduce阶段;如果业务逻辑非常复杂,就只能使用多个MapReduce程序,串行运行。
### 四、编写MapReduce程序
- ##### 用户需要编写的三个部分:Mapper、Reducer、Driver(提交MR程序)。
#### 4.1 以WordCount为例:
![](https://img2020.cnblogs.com/blog/1201165/202003/1201165-20200314170850390-872440303.png)
**1. 编写Mapper**
~~~java
// 注意:hadoop1.0版本中是mapred下包,hadoop2.0是mapreduce下的包
import org.apache.hadoop.mapreduce.Mapper;
// 继承Mapper父类,泛型为输入和输出的
加载全部内容