阶段
大致阶段: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