MapReduce的介绍

 

MapReduce是一种可用于数据处理的编程模型.

前面的博客说过,MapReduce是基于谷歌的同名论文,下面我来具体的说说MapReduce是做什么的,又是由什么组成的.

一个MapReduce分为两个阶段,也就是名字中的两个单词:map阶段与reduce阶段.简略流程是:map以(key, value)的形式输入数据并根据编写的map()处理数据,输出为(key, value)的形式,map的输出经过中间阶段(叫做shuffle)的处理,再以(key, value)的形式传入reduce()内进行处理,最后以(key, value)的形式输出最终结果.

可以看出,整个流程中数据是以(key, value)的形式流动的,核心也就是我们所编写的map()与reduce(),map和reduce中间还有一系列复杂的处理过程,这些中间过程是由Hadoop自动替我们完成的,我也会在以后的博客中说明这些过程.

一个MapReduce作业(Job)是客户端要执行的一个工作单元:它包括输入数据,MapReduce程序与配置信息.Hadoop将作业分成若干个任务来执行,它包括两类任务:map任务reduce任务.这些任务分布在集群的不同节点上,由YARN负责调度.如果一个任务失败,它将在另一个不同的节点上重新调度运行.

Hadoop将MapReduce的输入数据划分成等长的小数据块,称为输入分片(input split)或简称"分片".Hadoop为每个分片创建一个map任务,并由该任务来运行用户自己定义的map函数从而处理分片中的每条记录.

一个分片该有多大呢,默认情况下是HDFS的数据块大小,也就是128MB,不过这也是可以由我们自己指定的.可以想到,Hadoop会把拥有数据分片的节点作为map与reduce的任务节点,这样可以最大程度避免网络传输,极大地节省带宽资源.当然拥有数据分片的节点在执行其他map任务时,就会在同一机架上寻找空闲的节点来运行该任务,最坏的情况下,会被分配至其他机架上的节点运行.

map任务结束后,中间数据会被存储在哪里?首先,既然是中间结果,那么在任务结束后也就不会需要这些数据了,那么就无需存储在HDFS上的,因为HDFS是为了可靠存储,而中间结果的数据显然没有那么重要,所以就存储在本地硬盘上(当然,如果内存中装得下,就不会写入磁盘.).由reduce产生的个最终结果会被保存至HDFS集群,进行可靠存储.在整个作业都完成后,才会把map产生的中间结果删除掉,这样在某个reduce任务失败后,可以方便的获取数据再次运行该reduce任务.

reduce任务可能有一个,也可能有多个,如何分配给每个reduce任务的数据?这里要引入一个分区(partition)的概念,每个map任务最终的结果是包含若干个分区的,分区数就是由reduce任务数决定的.在中间处理过程,也就是shuffle中,map的最终结果会被合并成一个包含多个分区数据的文件,多个map任务就会有多个这样的文件,shuffle在向reduce任务传输数据的过程中,每个reduce对应的分区的数据会从多个map的输出文件中拉取过来合并成该reduce需要处理的数据.

自己粗略地做了一个图,来展示shuffle到结束的数据流向,只详细展示了其中一个reduce任务得拉取过程,其余的reduce的拉取数据的过程是一样的:

 map任务与reduce任务之间存在一个shuffle,这是MapReduce中最为消耗时间的过程,因为它对数据进行了多次处理,其中包括排序,分区,溢写,combiner等过程.combiner就是一个map端的reduce,可以让数据更加紧凑,所以一般都指定为reduce()所在的类(注意,有些任务中不适用combiner).这一切的处理都是为了减少map任务与reduce任务之间的网络传输,毕竟集群中最为稀缺的资源就是网络带宽,应该想尽办法节省.

如果我们只需要map处理,那么就可以不指定reduce任务,只需要把reduce任务数设置为0即可.这种情况下,map任务会直接把数据写入HDFS集群.

猜你喜欢

转载自blog.csdn.net/bujiujie8/article/details/86638196
今日推荐