MapReduce
1、MapReduce的介绍
MapReduce是一个简易的用来写应用程序的软件框架,基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上,它以可靠容错的方式并行的处理海量的数据。
2、MapReduce的原理
案列:
假设有三个工人去三个山头伐木,山上的树木有三种,即红木、橡木、樟木,砍伐完之后三个工人要将木材送到相应的木材加工厂。假设每个工厂只加工一种树木。工人就相当于Map,工人去山上伐木就是计算找数据,加工厂加工木材就是reduce。但是工人砍伐的树木在运送时很耗时,因为把树枝树叶等无用的材料也套运到加工厂,所以可以先进行一些小的组装,工人在山头的组装就是combiner,将半成品运送到加工厂就是shuffer。
分布式计算原理
(1)MR主要思想就是: 分久必合
(2)MapReduce是由两个阶段组成:Map端 Reduce端
(3)MR核心思想:“相同”的key为一组,调用一次reduce方法,方法内迭代这一组数据进行计算
假设:计算的数据在hdfs上,hdfs,block块按照字节来切割,极易出现乱码情况。 block约等于一个split切片,一个split切片就是一个map task。
(4)map task的工作流程:
1)先将处理好的每一条进行打标签,打标签的目的就是为了让这条数据知道将来要被哪一个reduce task处理。
打标签:分区
分区:是由分区器完成的 默认的分区器是HashPartitioner
如何分区?:根据key(每一条记录)的hashcode与reduce task的数量的取模
2)buffer:进入buffer之后,每一条记录都是由三部分组成的:分区号、key和value。
map task一条一条的将数据写入buffer,等到数据写到80M,会将这80M的数据进行封锁,封锁后会将这80M的数据进行combiner(小聚合),
排序:分区号 key,将相同的分区号的数据放到一起,然后排序sort
在封锁了80M数据的时候,数据还是会继续读入,只不过是读向剩余的20M。等到combiner和排序完成后,就开始向磁盘溢写数据。此时的磁盘就是一个分好区的内部有序的文件,combiner—>sort->spill。每进行一次溢写就会产生一个磁盘小文件。
3)map task计算完毕后,会将这些磁盘小文件合并成一个大文件,在合并的时候采用归并排序的算法。
每一个map task都会进行上述的所有情况,也就是每一个map task都会产生一个带有分区的内部有序的大文件。
(5)shuffle read阶段
去map端读取分区的数据,将分区数据写入内存中,内存满了就会溢写,溢写之前会进行排序,当把所有的数据读入之后,会将溢写产生的小文件进行归并,形成一个大文件。
(6)reduce阶段
每一组数据调用reduce函数 产生结果
(7)问题:
为什么要产生有序一个大文件?
为了提高分组的分组效率。归根来说,四次排序都是为了提高分组的效率。