mapreduce是一个高性能并行计算的计算平台,可部署在廉价的集群上
它将计算分成了map,shuffle,reduce阶段,可以通过接口对map,reduce过程进行编程
map:
hdfs中一个文件过大的话会被inputformat方法分成几个小块,然后分发给mapper(数量自己可以设置),mapper将接收的数据转换成键值对形式(key,value)输出,然后输出的内容会进入环形缓冲区
map shuffle:
经过partion处理后进入缓冲区
partion:对key的hash值取reducer数量的模。模值就是分区值
环形缓冲区是一个循环的数组,储存map输出的键值对和储存索引数据(四元组——(value起点位置,key起点位置,partion的值,value的长度))
每进入一个键值对,bufindex指针增长8,kvindex指针前进4个位置
当缓冲区数据达到指定阀值(一般为80%),会进行sortandsipll进程
sort:
对缓冲区的索引数据先按分区值排序,然后再分区内按key值排序
spill:
在本地磁盘空余的空间生成一个spill0.out文件,将缓冲区的数据写进去
同时也会有对应的spill0.index文件储存spill0.out文件里每个不同partion值的起点
在进行spill之后,缓冲区的分界点会重新界定——剩余空间的中点位置
最后会有一个merge阶段:
将所有spill.out文件里的相同分区合并,并在分区内排序,最后将结果输入在file.out文件里
对应会有一个file.index文件储存file.out文件里不同partion值的起点
reduce shuffle:
根据分区值,将file.out文件里的键值对分配到对应的redecuer上
map阶段完成时,通知父TaskTracker状态已经更新,TaskTracker进而通知JobTracker(这些通知在心跳机制中进行)。所以,对于指定作业来说,JobTracker能记录Map输出和TaskTracker的映射关系。Reduce会定期向JobTracker获取Map的输出位置,一旦拿到输出位置,Reduce任务就会从此输出对应的TaskTracker上复制输出到本地,而不会等到所有的Map任务结束。
reduce会一边获取map的输出,一边进行排序,最后生成一个有序的键值对,
reduce:
通过调用reduce函数
处理最后的键值对,将结果输入到hdfs里的指定文件里