您的位置:首页 > 其它

MapReduce执行流程

2014-07-05 21:53 323 查看
一 Map端(针对一个map task进行说明)



1 输入(inputspilt)

(1)计算并生成inputspilt,其大小可以设置,默认inputspilt的大小是一个block的大小;
(2)RecordReader解析inputspilt,调用nextKeyValue()方法对key和value赋值,生成key/value键值对作为map函数的输入;
(3)以TextInputFormat为例,key:当前内容的偏移量,即当前内容在文件中所在位置(字节数),value:一行内容;如:<0,aaa>,<5,bbb>

2 执行map函数
(1)根据业务逻辑对输入的key/value进行处理,然后输出所需的key/value键值对;

二 Shuffle(Map端)
1 shuffle过程就是对map task输出进行处理,然后作为reduce task输入的过程;

2 partition(分区)
(1)分区个数和reduce task的个数相同,每个reduce task负责一个partition数据的处理;
(2)可以根据业务需要自己写partition类,对数据进行分区,即不同的数据放到不同的分区中;

3 每个map task都有一个内存缓冲区,随着 map 的不断输出,当内存缓冲区快满的时候,会将缓冲区中的数据临时存放到磁盘上(hdfs上),当整个map task结束时,会将当前map task的输出的临时文件进行合并,生成最终的输出文件,等待reduce task来拉取数据;

4 memory buffer(内存缓冲区)
(1)内存缓冲区的大小可以通过“io.sort.mb”来设置,默认大小是100M;
(2)map输出先放到内存缓冲区中(包括分区信息),当map输出很多时,达到一个阈值(可以通过“io.sort.spill.percent”进行设置,默认为0.8,即缓冲区的80%:80M)时,就会将缓冲区中的数据写到磁盘上,这个过程就是spill; 当开始spill时,会启动另外一个线程执行,并且锁定80M内存,新的map输出结果可以向剩下的20M内存中写,互不影响;
(3)设置80%(不是100%)就开始进行spill是因为这样不会影响map输出继续向内存缓冲区中写,否则map输出必须等待内存的释放结束,也就是spill结束,这样就block了map的输出;

5 spill(溢写)
(1)在spill线程启动之后,根据partition的顺序对buffer中的数据(key)进行排序,即每个分区内进行排序;
(2)遍历partition:判断当前job是否设置了combine类,若设置了,则先进行combine,然后再写入到文件中;
(3)combine等同于reduce,将key相同的value加起来,减少spill到磁盘的数据量;但并不是所有的场景都可以用combine,如:求平均数,所以使用combine时一定要慎重,不能影响到输出结果;

6 merge(合并)
(1)如果一个map task的输出很大,多次spill会在磁盘上生成多个过文件;当map task结束时,内存缓冲区中的数据也会生成一个spill文件,所以在磁盘上至少有一个这样的spill文件,因为最终只有一个输出文件,所以需要将这些spill文件归并到一起,这个过程叫做merge;
(2)遍历partition:
A:从每个spill文件收集属于当前partition的数据,然后将属于同一个partition的段merge到一起,同时会把相同的可以进行分组,如:<aaa,[1,1,1]>;
B:判断当前job是否设置了combine类,若设置了,则先进行combine,然后写当前partition的信息写到索引文件中,即当前partition的开始位置和结束位置;
(3)最终将数据写入到文件;







7 map端运行结束;

三 Shuffle(Reduce端)



1 每个reduce task不断地通过RPC从JobTracker那里获取map task是否完成的信息,如果reduce task得到通知,获知某台TaskTracker上的map task执行完成(而不是等到所有map task都结束),Shuffle的后半段过程开始启动;

2 reducer函数真正运行之前,所有的时间都是在从不同的map输出拉取数据(copy),做merge(维持原来的顺序,不做排序),并且不断重复地在做;

3 reduce执行有三个步骤:copy,sort,reduce;

4 copy:启动多个线程进行拷贝,拷贝的过程中也在不停的merge;

5 sort:对merge后的结果进行排序,分组;

6 reduce:执行reduce函数

四 Reduce端
1 reduce:执行reduce函数,根据业务逻辑进行输出所需的key/value;

2 将结果输出到hdfs上;

五 总结

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: