简介
本章节咱们先来了解一些关于MapReduce的理论知识。从本章节您能够学习到:MapReduce的相关知识。java
一、概念
Mapreduce是一个分布式运算程序的编程框架,是用户开发“基于hadoop的数据分析应用”的核心框架;编程
Mapreduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个hadoop集群上。缓存
注意几个关键词便可:分布式、业务逻辑以及自带默认组件。并发
1.一、为何选择MapReduce
海量数据在单机上处理由于硬件资源限制,没法胜任而一旦将单机版程序扩展到集群来分布式运行,将极大增长程序的复杂度和开发难度。引入mapreduce框架后,开发人员能够将绝大部分工做集中在业务逻辑的开发上,而将分布式计算中的复杂性交由框架来处理。app
1.2 mapreduce分布式方案考虑的问题
mapreduce做为一个分布式解决方案,使用时至少须要考虑如下问题:框架
- 运算逻辑要不要先分后合?
- 程序如何分配运算任务(切片)?
- 两阶段的程序如何启动?如何协调?
- 整个程序运行过程当中的监控?容错?重试?
分布式方案须要考虑不少问题,可是咱们能够将分布式程序中的公共功能封装成框架,让开发人员将精力集中于业务逻辑上。分布式
而mapreduce就是这样一个分布式程序的通用框架。oop
1.三、MapReduce核心思想
mapreduce让我想起了java8新概念——流。学习
咱们来看一下官方提供的统计单词的案例的MapReduce示意图,从中了解mapreduce的思想。code

分布式的运算程序每每须要分红至少2个阶段
- 第一个阶段的maptask并发实例,彻底并行运行,互不相干
- 第二个阶段的reduce task并发实例互不相干,可是他们的数据依赖于上一个阶段的全部maptask并发实例的输出。
MapReduce编程模型只能包含一个map阶段和一个reduce阶段,若是用户的业务逻辑很是复杂,那就只能多个mapreduce程序,串行运行。
一个完整的mapreduce程序在分布式运行时有三类实例进程:
- MrAppMaster:负责整个程序的过程调度及状态协调
- MapTask:负责map阶段的整个数据处理流程
- ReduceTask:负责reduce阶段的整个数据处理流程
同时留意咱们示意图中提出的几个问题,一旦咱们知道了答案,就差很少学会了MapReduce的使用了,接下来就是探索这些问题的答案的过程。
1.四、MapReduce编程规范
用户编写的MapReduce程序分红三个部分:Mapper,Reducer,Driver(提交运行MapReduce程序的客户端)。
- Mapper阶段
- 用户自定义的Mapper要继承本身的父类
- Mapper的输入数据是KV对的形式(KV的类型可自定义)
- Mapper中的业务逻辑写在map()方法中
- Mapper的输出数据是KV对的形式(KV的类型可自定义)
- map()方法(maptask进程)对每个<K,V>调用一次
- Reducer阶段
- 用户自定义的Reducer要继承本身的父类
- Reducer的输入数据类型对应Mapper的输出数据类型,也是KV
- Reducer的业务逻辑写在reduce()方法中
- Reducetask进程对每一组相同k的
<k,v>
组调用一次reduce()方法
- Driver阶段 整个程序须要一个Drvier来进行提交,提交的是一个描述了各类必要信息的job对象。
在学习1.5节以前,推荐进入下一节编写一个简单案例:【hadoop】17.MapReduce-wordcount案例简单实现
1.五、MapReduce运行流程分析
以wordCount案例为基础,大体运行流程以下:

- 在MapReduce程序读取文件的输入目录上存放相应的文件。
- 客户端程序在submit()方法执行前,获取待处理的数据信息,而后根据集群中参数的配置造成一个任务分配规划。
- 客户端提交job.split、jar包、job.xml等文件给yarn,yarn中的resourcemanager启动MRAppMaster。
- MRAppMaster启动后根据本次job的描述信息,计算出须要的maptask实例数量,而后向集群申请机器启动相应数量的maptask进程。
- maptask利用客户指定的inputformat来读取数据,造成输入KV对。
- maptask将输入KV对传递给客户定义的map()方法,作逻辑运算
- map()运算完毕后将KV对收集到maptask缓存。
- maptask缓存中的KV对按照K分区排序后不断写到磁盘文件
- MRAppMaster监控到全部maptask进程任务完成以后,会根据客户指定的参数启动相应数量的reducetask进程,并告知reducetask进程要处理的数据分区。
- Reducetask进程启动以后,根据MRAppMaster告知的待处理数据所在位置,从若干台maptask运行所在机器上获取到若干个maptask输出结果文件,并在本地进行从新归并排序,而后按照相同key的KV为一个组,调用客户定义的reduce()方法进行逻辑运算。
- Reducetask运算完毕后,调用客户指定的outputformat将结果数据输出到外部存储。