MapReduce的流程

来源:互联网 发布:可控核聚变骗局知乎 编辑:程序博客网 时间:2024/05/01 03:30

   又重新开始看Hadoop,坚定的走这条路吧。以后也会把自己的一些理解写下来,如果有不对的地方请大家指出。

   先从MapReduce的Map和Reducer说起。用Hadoop的分布式计算框架处理数据时:先通过Map函数处理键值对,再将Map函数的输出作为Reduce函数的输入,Map函数的输出键值对类型必须和Reduce函数的输入的键值对类型一致,最后Reduce函数计算完成后将结果输出到HDFS中。总的情况很简单,但是深入后它会有很多的地方需要去研究。

   Hadoop平台的分布式计算框架MapReduce和Hadoop分布式文件系统HDFS是核心。HDFS是由集群的节点组成的文件系统,和传统的文件系统的不同主要就在这里,HDFS有多个DataNode,存储的数据也是分布在这些节点上的,可以把集群的这些节点看作是一个整体,数据存放在里面,使用时读取数据即可。处理数据是,一般是map函数处理存放在本节点上的数据,因为网络有带宽的开销,数据量大时则会严重影响性能。

 使用hadoop平台处理整个数据,相当于每一个map函数和reduce函数处理的总和,所以一个map函数和一个reduce函数就可以说明其他的问题。

 当处理程序提交到hadoop平台上时,每一个节点都会分发打包分发map处理程序,这时,map线程会去处理相应的数据,每一个节点上有多个map线程。当一个map任务处理数据时,会将结果写入一个内存缓冲区,如果内存缓冲区满了之后则会将结果写入到磁盘上,一直到将数据全部处理完。在map过程还有很重要的步骤要做:将处理结果按照键值排序,这是系统默认的,有时候处理问题需要排序时,则可以利用系统自带排序功能。如果处理过程中combine时,则需要合并相同的键值对,这样做的目的是减少网络传输值的大小。combine函数和reduce函数是一样的作用,但是它们所使用的地方以及上下文则不是一样的。在map上处理的结果就完成了。

 下一步就是在reduce上处理了,但是在reduce上处理之前,每一个DataNode上处理的结果如何分配到reduce上呢?中间还是需要几个过程。

 Mapper最终处理的键值对<key, value>,是需要送到Reducer去合并的,合并的时候,有相同key的键/值对会送到同一个Reducer那。哪个key到哪个Reducer的分配过程,是由Partitioner规定的。它只有一个方法:getPartition(Text key, Text value, int numPartitions)  

 partitioner类的作用是:将map产生的相同的键值对按照一定的规则发送给具体的reduce去处理,默认的是Hash排列,但是如果需要自定义reduce处理,则需要继承Partitioner类,重写getpartition方法,它的第三个参数的意思是分为几个区,也就是有几个reduce,而这个参数的值是通过configuration的  set函数来设置的,设置reduce个数的属性是mapred.reduce.tasks,需要几个reduce就设置几个分区。这样保证如果有相同的key值,肯定被分配到同一个reducre上。如果有N个reducer,编号就为0,1,2,3……(N-1)。

 shuttle的作用是:表示reduce任务获取map输出的这部分过程,reduce有线程自动去获取map端输出的结果。有多个DataNode,每个DataNode上面有多个map线程处理的结果,而它们当中有相同的键值对,所以需要将这些相同的键的键值对放到同一个reduce上去处理,就涉及了键值对的合并。这些都是reduce的线程去取数据放到reduce线程所在的节点的本地;这个过程需要jobtracker的协调。

 Reducer是所有用户定制Reducer类的基类,和Mapper类似,它也有setup,reduce,cleanup和run方法,其中setup和cleanup含义和Mapper相同,reduce是真正合并Mapper结果的地方,它的输入是key和这个key对应的所有value的一个迭代器,同时还包括Reducer的上下文。

 数据传输到reduce端后,会按照键值进行一个排序,然后再进行处理,最后将结果写到分布式文件系统。

 这个大致上就是从map到reduce的过程。

 需要设置属性值时,用configuration设置。

 


0 0
原创粉丝点击