MapReduce执行流程详解

来源:互联网 发布:仓库管理java源码下载 编辑:程序博客网 时间:2024/05/01 01:25

       在hadoop中,每个mapreduce任务都会被初始化为一个Job。每个Job又可以分为两个阶段:map阶段和reduce阶段。这两个阶段分别用两个函数来表示,即map函数和reduce函数。map函数接收一个<key,value>形式的输入,然后产生同样为<key,value>形式的中间输出,hadoop会负责将所有具有相同中间key值的value集合到一起传递给reduce函数,reduce函数接收一个如<key,(list of values)>形式的输入,然后对这个value集合进行处理并输出结果,reduce的输出 也是<key,value>形式的。

       为了方便理解,分别将三个<key,value>对标记为<k1,v1>、<k2,v2>、<k3,v3>,那么上面所述的过程就可以用下图来表示了。


1、InputFormat()和InputSplit

       InputSplit是hadoop中用来把输入数据传送给每个单独map,InputSplit存储的并非数据本身,而是一个分片长度和一个记录数据位置的数组。生成InputSplit的方法可以通过InputFormat()来设置。当数据传送给map时,map会将输入分片传送到InputFormat()上,InputFormat()则调用getRecordReader()方法生成RecordReader,RecordReader再通过createKey()、createValue()方法创建可供map处理的<key,value>对,即<k1,v2>。简而言之,InputFormat()方法是用来生成可供map处理的<key,value>对的。

       TextInputFormat是hadoop默认的输入方法,在TextInputFormat中,每个文件(或其中一部分)都会单独作为map的输入,二这是继承自FileInputFoemat的。之后,每行数据都会生成一条记录,每条记录则表示成<key,value>形式:

       key值是每个数据的记录在数据分片中的字节偏移量,数据类型是LongWritable;

       value值是每行的内容,数据类型是Text。

2、OutputFormat()

       对于每一种输入格式都有一种输出格式与其对应。同样,默认的输出格式是TextOutputFormat,这种输出方式与输入类似,会将每条记录以一行的形式存入文本文件。不过,他的键和值可以是任意形式的,因为程序内部会调用toString方法将键和值转化为string类型再输出。

3、map()

       map()函数继承自MapReduceBase,并且它实现了Mapper接口,此接口是一个范型类型,它有4种形式的参数,分别用来指定Map()的输入key值类型、输入value值类型、输出key值类型和输出value值类型。

4、reduce()

       与map()类似,reduce函数也继承自MapReduceBase,需要实现Reducer接口,Reduce函数以Map()的输出作为输入。


      负责控制及调度MapReduce的Job的是JobTracker,负责运行MapReduce的Job的是TaskTracker。当然,MapReduce在运行时是分成Map Task和Reduce Task来处理的,而不是完整的Job。简单的控制流大概是这样的:JobTracker调度任务给TaskTracker,TaskTracker执行任务时,会返回进度报告。JobTracker则会记录进度的进行状况,如果某个TaskTracker上的任务执行失败,那么JobTracker会把这个任务分配给另一台TaskTracker,直到任务执行完成。


       这里更详细的解释一下数据流,数据首先按照TextInputFormat形式被处理成多个InputSplit,然后输入到多个Map中,Map程序会读取InputSplit指定位置的数据,然后按照设定的方式处理该数据,最后写入到本地磁盘中,注意,这里并不是写到HDFS上,这应该很好理解,因为Map的输出在Job完成后壳删除了,因此不需要存储到HDFS上,虽然存储到HDFS上会更安全,但是因为网络传输会降低MapReduce任务的执行效率,因此Map的输出文件时写在本地磁盘上的。如果Map程序在没来得及将数据传送给Reduce时就崩溃了(程序出错或者机器崩溃),那么JobTracker只需要另选一台机器重新执行这个Task就可以了。

       Reduce会读取Map的输出数据,合并value,然后将他们输出到HDFS上。Reduce的输出会占用很多的网络宽带,不过这与上传数据一样是不可避免的。

       此外,还有两中情况需要注意:

       1、MapReduce在执行过程中往往不止一个Reduce Task,Reduce Task的数量是可以程序指定的。当存在多个Reduce Task时,每个Reduce会搜集一个或多个key值,需要注意的是当出现多个Reduce Task时,每个Reduce Task都会生成一个输出文件。

       2、另外,没有Reduce任务的时候,系统会直接将Map的输出结果作为最终结果,同时Map Task的数量可以看做是Reduce Task的数量,即有多少个Map Task 就有多少个输出文件。

1 0
原创粉丝点击