用自己的话讲:
首先Map去hdfs读取文件存储信息,读到块。然后切片,切片数量跟task数量一致,所以这里可以动态调整task的数量。然后Map将这些块读到内存——环形缓冲区,环形缓冲区一般大小为100M,到80%时,开始溢写,同时在剩下的区域开辟新赤道,持续读入,这样减少了卡顿,做到了持续输入输出。而在环形缓冲区中,要对待处理文件进行分区,排序操作。分区是对key使用hash方法分区,而排序是使用快速排序。随后在溢写操作中,对文件合并,最多10个合并一个,在这里也可以使用Combiner组合器来实现预聚合到硬盘。
然后Reduce开始拉取,当Map溢写到5%时,开始拉取,拉取到后在Reduce中实现归并操作,使用归并排序,排序之后,再分组(首先查找有没有程序员自定义分组器,如果没有则看程序员有没有自定义比较器,有则使用比较器。最后都没有则按照MapTask写出的key的比较器进行分组),分组之后再执行程序员自己写的Reduce方法,得到最终结果,然后输出到指定地,可以是HDFS,DB,NOSQL.