MapReduce简介和过程浅析
预备知识:什么是hadoop,HDFS?
Hadoop是一个开源框架,它允许在整个集群使用简单编程模型计算机的分布式环境存储并处理大数据。它的目的是从单一的服务器到上千台机器的扩展,每一个台机都可以提供本地计算和存储。
HDFS全称为Hadoop Distributed File System(分布式文件系统),可以粗浅得理解成将很大的文件分成固定大小的小片,存储在多个计算机上,更详细的参考:https://www.cnblogs.com/codeOfLife/p/5375120.html
1、什么是mapreduce?
Map/Reduce是一个用于大规模数据处理的分布式计算编程模型,用户在使用时,需要定义Map和Reduce函数。
map函数用来处理原始数据(初始键值对)以生成一批中间的key/value对,reduce函数将所有这些中间的有着相同key的values合并起来。
2、mapreduce运行大致过程。
两个计算阶段:
(1)Map
由一个或者多个MapTask组成。
每个MapTask处理输入数据集合中的一片数据(InputSplit),并将产生的若干个数据片段(一个数据文件)写到本地磁盘上。
(2)Reduce
由一个或者多个ReduceTask组成。
ReduceTask则从每个MapTask上远程拷贝相应的数据片段,经分组聚集和归约后,将结果写到HDFS上作为最终结果。
3、MapTask
执行过程概述:
首先,通过用户提供的InputFormat将对应的InputSplit解析成一系列key/value,并依次交给用户编写的map()函数处理,接着按照指定的Partition对数据分片,以确定每个key/value将交给哪个ReduceTask处理,之后将数据交给用户定义的Combiner进行一次本地合并(没有则直接跳过),最后即将处理结果保存到本地磁盘上。
具体步骤:
(1)Read阶段:MapTask通过用户编写的RecordReader,从输入InputSplit中解析出一个个key/value。
(2)Map阶段:该阶段只要是将解析出的key/value交给用户编写的map()函数处理,并产生一系列新的key/value。
(3)Collect阶段:在用户编写的map()函数中,当数据处理完成后,一般会调用OutputCollector.collect()输出结果。在该函数内部,它会将生成的ley/value分片(通过调用Partition),并写入一个环形内存缓冲区中。
(4)Spill阶段:即“溢写”,当环形缓冲区满后,MapReduce会将数据写到本地磁盘上,生成一个临时文件。需要注意的是,将数据写入本地磁盘之前,先要对数据进行一次本地排序,并在必要时对数据进行合并操作。
(5)Combine阶段:当所有数据处理完成后,MapTask对所有临时文件进行一次合并,以确保最终只会生成一个数据文件。
4、ReduceTask
执行过程概述:
ReduceTask的输入数据来自各个MapTask,因此首先通过HTTP请求从各个已经运行完成的MapTask所在TaskTracker机器上拷贝相应的数据分片,待所有数据拷贝完成后,再以key为关键字对所有数据进行排序(sort),通过排序,key相同的记录聚集到一起形成若干分组,然后将分组数据交给用户编写的reduce()函数处理,并将数据结果直接写到HDFS上作为最终输出结果。
具体步骤:
(1)Shuffle阶段:也称为Copy阶段。ReduceTask从各个MapTask所在的TaskTracker上远程拷贝一片数据,并针对某一片数据,如果其大小超过一定阈值,则写到磁盘上,否则直接放到内存中。
(2)Merge阶段:在远程拷贝数据的同时,ReduceTask启动了两个后台线程对内存和磁盘上的文件进行合并,以防止内存使用过多或磁盘上的文件过多,并且可以为后面整体的归并排序减负,提升排序效率。
(3)Sort阶段:按照MapReduce的语义,用户编写的reduce()函数输入数据是按key进行聚集的一组数据。为了将key相同的数据聚集在一起,Hadoop采用了基于排序的策略。由于各个MapTask已经实现了自己的处理结果进行了局部排序,因此,ReduceTask只需要对所有数据进行一次归并排序即可。
(4)Reduce阶段:在该阶段中,ReduceTask将每组数据依次交给用户编写的reduce()函数处理。
(5)Write阶段:reduce()函数将计算结果写到HDFS上。