目录
MapReduce思想核心
先分再合,分而治之
把一个复杂的问题按一定的"分解"方法分为规模较小的若干部分,分别找出各个部分的解,再把各部分的解组成整个问题的解。
map特点
①分的阶段,局部并行运算
②把复杂任务拆分成若干个小的任务,以并行方式处理,每个任务处理完都是一个局部的结果。
③前提是任务可以拆分,且拆分后没有依赖关系
④map侧重于映射(对应关系)
reduce特点
①汇总阶段,全局汇总计算
②把分的阶段局部结果进行全局汇总,得到最终结果
③reduce指的是结果数量的减少,汇总
MapReduce设计构思
MapReuce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。
①构建抽象模型
map:对一组数据元素进行某种重复式的处理;
reduce:对map的中间结果进行某种进一步的结果整理
②MapReduce处理的数据类型是<key,value>键值对,定义了两个抽象的编程接口,由用户去编程实现:

③统一架构,隐藏系统层细节
MapReduce设计并提供了统一的计算框架,隐藏了绝大多数系统层面的处理细节(如数据存储、分发、结果收集等)。
通过抽象模型和计算框架把需要做什么和具体怎么做分开了,为程序员提供一个抽象和高层的编程接口和框架。程序员仅需要关心应用层的具体计算问题。
使用MapReduce进行单词统计原理

map阶段处理逻辑
根据分隔符切割内容变成一个个单词,把单词标记1,变成<key,value>键值对形式
reduce阶段处理逻辑
经过shuffle把相同的单词分为一组,把对应的value进行累加,输出的结果就是该单词出现的总次数
MapReduce基本原理
MapReduce输入和输出
关于input
指向的是一个文件,mr就处理这一个文件
指向的是一个目录,mr就处理该目录下的所有的文件整体当作数据集处理
关于output
要求指定的目录为空目录不能够存储,否则执行校验失败
执行过程

Map阶段执行过程

第一阶段
把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划。默认情况下,Split size = Block size。每一个切片由一个MapTask处理。(getSplits)
第二阶段
对切片中的数据按照一定的规则解析成<key,value>对。默认规则是把每一行文本内容解析成键值对。key是每一行的起始位置(单位是字节),value是本行的文本内容。(TextInputFormat)
第三阶段
调用Mapper类中的map方法。上阶段中每解析出来的一个<key,value>,调用一次map方法。每次调用map方法会输出零个或多个键值对。
第四阶段
按照一定的规则对第三阶段输出的键值对进行分区。默认有一个区。分区的数量就是Reducer任务运行的数量。默认有一个Reducer任务。
第五阶段
对每个分区中的键值对进行排序。首先,按照键值对进行排序,对于键相同的键值对,按照值进行排序。比如三个键值对<2,2>,<1,3>,<2,1>,键和值分别是整数。排序后的结果是<1,3><2,1><2,2>
#如果没有第六阶段,直接输出文件
第六阶段
对数据进行局部聚合处理(combiner处理)。键相等的键值对会调用一次reduce方法。经过这一阶段,数据量会减少。本阶段默认没有。
Reduce阶段执行过程

第一阶段
Reducer任务会主动从Mapper任务赋值其输出的键值对,Mapper任务可能会有很多,因此Reducer会赋值多个Mapper的输出。
第二阶段
把复制到Reducer本地数据全部进行合并,即把分散的数据合并成一个大的数据。再对合并后的数据排序。
第三阶段
对排序后的键值对调用reduce方法。键相等的键值对调用一次,每次调用会产生零个或多个键值对。最后把这些输出的键值对写入到HDFS文件中。
Shuffle机制
map阶段处理的数据如何传递给reduce阶段,是MapReduce框架中最关键的一个流程,,一般也把Map产生输出开始到Reduce取得数据作为输入之前的过程称作shuffle。
核心机制:数据分区,排序,合并

Collect阶段
将MapTask的结果输出到默认大小为100M的环形缓冲区,保存的是key/value,Partition分区信息等。
Spill阶段
当内存的数据量达到一定的阈值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,还会将有相同分区号和key的数据进行排序。
Merge阶段
把所有溢出的临时文件进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。