Map和Reduce的执行过程

                                                      Map和Reduce的执行过程

当要运行一个mapreduce应用程序时,可以分为一下几个步骤:

1.用户提交任务.

2.jobTracker:相当于namenode,来协调job的运行.

3.taskTracker:相当于datanode,运行此job的task,该taskTracker有两个线程:一个是,mapTask,一个是,reduceTask.


 用户提交任务时,它会向jobTracker申请新的job ID,并且计算得到输入文件input splits的数目,也就是:输入文件可以被分成多少block,block默认大小是:64M.

jobTracker会将此任务放入到队列中,然后jobTracker中某对象会轮回的查询该队列中是否有新的job,如果有则取出Job进行分配,它根据input splits的数目来创建map task的数目,并且为每个task创建一个ID.


taskTracker会每隔一段时间向jobTracker发送心跳信息和块状态(该taskTracker中存储输入文件中哪些块),告知其已经可以运行task任务了,然后jobTracker会选择其中的taskTracker进行运行,一般是选择taskTracker本地系统中已经有输入文件的部分块.taskTracker调用map task进行运行.

下面说下:map和reduce的具体执行过程:

Map 端:

1.读取数据和进行map函数运算的过程.

    它首先读取input split进行map函数运算,产生输出结果.

2.将输出结果写入到内存中或磁盘中的过程.


            该输出结果并非是直接写入到磁盘中,而是先写入到buffer中,当达到一定值时(默认值为:buffer的大小*0.8),这个值可以自己设定.再启动另一个线程将buffer中的数据写入到磁盘中.这叫溢写的过程,得到溢出文件,这样做的好处是:将输出结果写到内存中的线程和将内存中的数据写入到磁盘中的线程可以并行的进行.将输出结果写到内存的过程中,它会按照key的值进行排序.

3.merge过程.

当输出结果很大时,一个map Task会得到很多个溢出文件,最终会把这些溢出文件merge成一个文件,这个过程也会按照key的值进行排序.

Reduce端:

reduce过程分为三个阶段:

1.copy的过程.

2.sort的过程.

3.进行reduce函数运算

1.copy的过程.

这个过程其实就是:从map端下载数据的过程.因为map的输出是reduce的输入.reduceTask的数目可以通过参数来设定,当设定好reduceTask的数目时,可以通过hash函数,比如:拿key的值取模reduce Task的数目,来得到属于每个reduce Task的数据.当然reduce Task会从不同的map Task输出结果中下载属于自己的数据.必须注意的是:reduce Task下载数据时必须是从已经完成的map Task中的输出结果中下载数据.

2.sort的过程.

当reduce Task下载到属于自己的数据时,也会将这些数据merge成一个文件.在这个过程中,它会对key值进行排序.之前我不理解为什么这个过程会有排序?后来通过和我们组的成员探讨逐渐明白了.

我们可以知道:Map的输出结果是:key 和value键值对的形式,但是,reduce的输入确是:key 和队列的形式,那么在map和reduce之间的这个过程,肯定底层的某个东东将其转换了,目前我还不知道到底是什么东东.假设没有sort的过程,那么在转换的过程,将相同key值的value值放入到队列中时,查找相同key值时是非常耗费时间的,所以sort过程是很有必要的.

3.进行reduce函数,得到输出结果.

这个时候,reduce Task的任务已经完成,当所有的reduce Task任务完成之后,就会发送信息给taskTracker,所有的任务已经完成,这时,taskTracker也会发送信息给jobTracker,说,任务已经完成,jobTracker就会将该job任务已经完成的信息返回给用户.之前说过:jobTracker它会轮回的查询队列中是否有新的job,当有新的job时,又进行分配.

猜你喜欢

转载自willyii.iteye.com/blog/1397416