一 定义及由来
MapReduce是一种计算模型也可以说是一种分布式运算程序的编程框架,它可以将大型数据处理任务分解成很多单个的、可以在服务器集群中并行执行的任务,而这些任务的计算结果可以合并在一起来计算最终的结果。简而言之,Hadoop Mapreduce是一个易于编程并且能在大型集群(上千节点)快速地并行得处理大量数据的软件框架,以可靠,容错的方式部署在商用机器上。
MPI等并行计算方法缺少统一的计算框架支持,程序员需要考虑数据存储、划分、分发、结果收集、错误恢复等诸多细节;为此,MapReduce设计并提供了同意的计算框架,为程序员隐藏了绝大多数系统层面的处理系统。
总结一句话就是运用分而治之的原理实现了大数据的划分、计算与合并,并大大减轻了程序员的学习以及开发压力。
二 优缺点
1.优点:易于编程,易于扩展,高容错,适合海量数据处理
2.缺点:不擅长实时的计算,不擅长长流式计算,不擅长有向图计算
三 工作原理
mapreduce分为两个阶段map 与 reduce;一个完整的mapreduce分为三个进程master,maptask,reducetask.
1.map:字面意思映射,将数据映射成你想要的形式。拿到数据后由inputformat将数据切片,一按般块大小128M来切,切片是不考虑数据集整体会安文件逐个切然后交给maptask。一般maptask会尽量在数据本地运行,一个切片对应一个maptask,而一个maptask一般处理128M数据所以为了避免网络io按128M来切。生成k,v值交给Mapper(此时进入到shuffle阶段)。
2.shuffle
将其写入环形缓冲区,此时每个k,v都自带一个分区号,在缓冲区中将数据分区(按分区号排序)然后按key快排此时相当于将数据分组因为此时相同key数据挨在一起,缓冲区默认100M达到80%后自动溢出到文件然后将所有文件进行按分区归并排序。分区和reducetask没有必然联系,默认分区和reducetask数量相同,分区和reducetask对应,reducetask数量可以多于分区数量,但不能少而且分区号是从头开始逐一累加的。分区的意义就是告知数据应该归于哪一个reducetask处理。
3.reduce:归并整合,reducetask将处理所有的maptask生成的相应分区的文件进行归并排序此时所有数据都是按key有序的,交给reducer然后输出。
附一张某机构的图供参考