深入Hadoop之MapReduce

来源:互联网 发布:淘宝无线端短连接 编辑:程序博客网 时间:2024/06/05 15:40

MapReduce工作流程

这里写图片描述

WordCount 处理过程

这里写图片描述
1、将文件拆分成splits,并将文件按行分割成”key,value”对。
2、将分割好的”key,value”对交给用户定义的map方法进行处理,生成新的”key,value”对。
3、将map方法输出的”key,value”对后,Mapper会将它们按照key值进行排序。
4、Reduce先对Mapper接收的数据进行排序,在交给用户自定义的reduce方法进行处理得到新的”key,value”对,并作为WordCount的结果输出。

Shuffle过程

概念
shuffle的意思是洗牌或打乱。
Collections.shuffle(list) :随机地打乱参数list里的元素顺序。
MapReduce里的shuffle:描述着数据从map task输出到Reduce task输入的这个过程。
Shuffle过程图
这里写图片描述
1、Collect阶段:将MapTask的结果输出到默认大小为100M的MapOutputBuffer内部环形内存缓冲区,保存的是”key,value”、Partition分区。
2、Spill阶段:当内存中的数据量达到一定的阀值的时候,就会将数据写入本地磁盘,在将数据写入磁盘之前需要对数据进行一次排序的操作,先是对partition分区号进行排序,再对key排序,如果配置了combiner,还会将有相同分区号和key的数据进行排序,如果有压缩设置,则还会对数据进行压缩操作。
3、Combiner阶段:等MapTask任务的数据处理完成之后,会对所有map产生的数据结果进行一次合并操作,以确保一个MapTask最终只产生一个中间数据文件。
4、Copy阶段:当整个MapReduce作业的MapTask所完成的任务数据占到MapTask总数的5%时,JobTracker就会调用ReduceTask启动,此时ReduceTask就会默认的启动5个线程到已经完成MapTask的节点上复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上。
5、Merge阶段:在ReduceTask远程复制数据的同时,会在后台开启两个线程对内存中和本地中的数据文件进行合并操作。
6、Sort阶段:在对数据进行合并的同时,会进行排序操作,由于MapTask阶段已经对数据进行了局部的排序,ReduceTask只需做一次归并排序就可以保证Copy的数据的整体有效性。

MapReduce调优

Map Task 输出压缩:在数据量大的时候,对map输出进行压缩通常是个好主意。
Shuffle Phase 参数:如果能够让所有数据都保存在内存中,可以达到最佳的性能。通常情况下,内存都保留给reduce函数,但是如果reduce函数对内存需求不是很高,将mapreduce.reduce.merge.inmem.threshold(触发合并的map输出文件数)设为0,mapreduce.reduce.input.buffer.percent(用于保存map输出文件的堆内存比例)设为1.0,可以达到很好的性能提升。
Reduce Task Number:避免写入多个spill文件可能达到最好的性能,一个spill文件是最好的。通过估计map的输出大小,设置合理的mapreduce.task.io.sort.*属性,使得spill文件数量最小。

原创粉丝点击