阶段
大致阶段:split->map->shuffle->reduce
split阶段
split是将一个大文件进行逻辑上的切片,主要记录的是数据位置而非数据本身,一个分片对应一个map,以提高map处理的并行度。由于map任务的本地化,split大小默认和block大小相同,避免跨节点block带来网络开销
map阶段
每个map任务是一个java进程,它会读取HDFS中自己的输入分片,将分片中的数据按照一定规则解析成很多的键值对
shuffle阶段
shuffle阶段完成对数据的分区,排序和合并等操作,描述着数据从map端流向reduce端的过程,分为map shuffle 和 reduce shuffle
mapshuffle
一、map输出的结果存到内存缓冲区中(其中会进行快速排序,以提高效率),该缓冲区默认大小为100M,当达到80M(80%)时,系统会系统一个spill线程,会将缓冲区数据溢写到磁盘
二、溢写文件前,先根据分区号和key进行排序,根据reduce任务数将数据划分成相同数目的partition(为避免分区导致不同reduce分配数据量不均衡。分区就是hash过程,默认按照hash(key)%numRedeceTask = 分区号)写入文件,然后对每个partition进行排序,此时如果有combiner,会将排序后的数据进行合并(类似reduce操作),以减少流入reduce端的数据量。
三、如果map数据量大,会产生很多split文件,需要将这些spill文件合并成一个文件,合并的过程中会不断进行归并排序和combiner操作,尽量减少写入磁盘的数据量,以减少输出到reduce端的网络开销
reduceshuffle
一、通过http从map任务所在TaskTracker获取对应的partition数据,先放在内存缓冲区(默认JVM堆大小的70%),如果缓冲区放得下就直接把数据写入内存,即内存到内存merge。如果缓冲区中的Map数量达到一定大小(缓冲区的66%)的时候,就会开启内存merge,并将merge后的数据写入磁盘,即内存到磁盘merge。
二、当属于该Reduce任务的map输出全部拉取完成,则会在reduce任务的磁盘上生成多个文件(如果所有map输出的大小没有超过缓冲区大小,则数据只存在于内存中),这时开始最后的合并操作,即磁盘到磁盘merge。如果设置了combiner,则合并时也会执行。
三、由于map输出的数据已经是有序的,所以Reduce在合并时的排序是归并排序,并且reduce端的copy和sort是同时进行的,最终得到一个整体有序的数据,当reduce任务执行完拉取和排序合并后,就会对相同的key进行分组
Reduce阶段
最终归并。Shuffle阶段已经将数据分组成了<key, Iteralble<value,>>格式的数据,所以对于相同的key只会调用一次reduce()方法
本文详细解析了MapReduce的执行过程,包括split阶段,map阶段,shuffle阶段(mapshuffle和reduceshuffle)以及reduce阶段。在split阶段,大文件被逻辑切片,map阶段中数据被解析成键值对,shuffle阶段负责数据的分区、排序和合并,而reduce阶段则进行最后的数据归并。整个流程确保了数据的有效处理和传输效率。

292

被折叠的 条评论
为什么被折叠?



