首页 > 代码库 > MapReduce 编程 系列十二 Reduce阶段内部细节和调节参数

MapReduce 编程 系列十二 Reduce阶段内部细节和调节参数

Reduce计算分为若干阶段

1. copy(或者叫shuffle)阶段和merge阶段并行

之前Map产生的结果被存放在本地磁盘上,这时需要从reduce节点将数据从map节点复制过来。放得下进内存,比较大的则写到本地磁盘。

同时,有两个线程对已经获得的内存中和磁盘上的数据进行merge操作。

具体细节是:

通过RPC调用询问task tracker已经完成的map task列表,shuffle(洗牌)是对所有的task tracker host的洗牌操作,这样可以打乱copy数据的顺序,防止出现网络热点(大量进程读取一个task tracker节点的数据)。

可以复制的任务被存放在scheduledCopies中。

一旦有了要复制到数据,会启动多个MapOutputCopier线程,通过HTTP GET请求复制数据,如果数据较大,存入磁盘,否则存入缓存。

对于缓存中,有线程InMemoryFSMerge线程负责merge,对文件,有LocalFSMerger线程负责merge。


因此观察jobtracker会看到map操作还没有完全结束,reduce操作已经开始了,就是进入了copy阶段。


2. sort阶段和调用reducer的reduce函数的并行

sort对Map阶段传来的<key,value> 数据针对key执行归并排序,产生<key, values>

用户编写的reduce将上面的<key, values>传递进ruduce函数处理


并行的算法提高了程序性能,具体算法以后再探讨。

3. write

将结果写到HDFS上。


Reduce的调优参数

mapred.reduce.parallel.copies 默认是5,表示有多少个并发线程去从task tracker节点复制数据

io.sort.factor 又出现了,默认10,仍然指的是并行合并文件的数目

mapred.job.shuffle.merge.percent 默认是0.66, 超过66%,就会将开始合并,然后往磁盘上写数据

mapred.inmem.merge.threshold 默认是1000,超过这个临界值,就会将开始合并,然后往磁盘上写数据




MapReduce 编程 系列十二 Reduce阶段内部细节和调节参数