之前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阶段。
sort对Map阶段传来的<key,value> 数据针对key执行归并排序,产生<key, values>
用户编写的reduce将上面的<key, values>传递进ruduce函数处理
并行的算法提高了程序性能,具体算法以后再探讨。
将结果写到HDFS上。
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阶段内部细节和调节参数
原文地址:http://blog.csdn.net/csfreebird/article/details/39778857