您的位置:首页 > 运维架构

Hadoop笔记之map &&shuffle && reduce 工作流程图及其分析

2015-09-16 14:51 253 查看
与其说shuffle为mapreduce之间的独立处理函数 不如说是map中数据输入reduce一通道,因为shuffle一部分属于对map task 另一部分为reduce task

Map函数产生输出时,为了保证I/O效率,采用了先写到内存的环形缓冲区,并做一次预排序,每个Map任务都有一个环形内存缓冲区,(默认大小100MB),一旦缓冲区内数据达到80%(默认比例)的阈值后台程序做两件事

一将缓冲区的内容溢写到磁盘分区中( 在写磁盘之前,线程会跟据数据最终要传达的到Reducer把缓冲区划分(默认按照键)相应的分区.每个分区中,后台线程按键进行内排序.此时如果有一个Combiner.它会在排序后的输出上运行.),在写磁盘的过程中,map函数的输出继续写到缓冲区,直到填满阻塞.

二是新建一个溢出文件,因此在Map任务写完其最后一个输出记录后,会有若干溢出写文件( 如果已经指定Combiner且溢出次数至少为3时,Combiner就会在输出的文件写到磁盘之前运行,不会影响输出结果.Combiner意义在于使Map的输出的中间结果更加紧凑,使得写到本地磁盘和传给Reducer的数据更少(减少网络传输压力,提高数据的传输效率).在Map任务完成之前,溢出写文件被合并成一个已分区且已排序的文件作为map的中间结果,也就是map任务的输出结果.

另外为了提高磁盘I/O性能,可以考虑压缩map的输出,这样会让磁盘写的速度更快,节约磁盘空间从而使传给Reducer的数据量减少.默认情况不压缩的.

shuffle即是数据的清洗,它是消化从map传到Reducer过程中的数据.

如上面所述,map的任务输出结果运行Map任务的TaskTracker所在的结点的本地磁盘上,TaskTracker需要为map输出数据,一个map输出的数据为Reducer一个数据输入分区.由于每个map任务完成的时间不同,所以一旦有一个map的任务被完成,Reducer任务就开始复制其输入,这就是shuffle的Copy阶段,复制完成map的输出,shuffle进入sort排序阶段.此阶段合并map的输出文件.如果有有50个map输出文件,而合并因子为10,合并操作将进行5此,每次将10个文件合并成一个,最终得到5个文件,由于这5个文件不满合并条件(小于合并因子10),则不会合并,直接把5个文件交给reducer函数处理.至此,shuffle阶段完成.

从shuffle的过程可以看出,Map任务处理的是一个InputSplit,二Reduce任务处理的是所有Map任务同一个分区的中间结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: