mapreduce为什么要排序
是为了通过外排(外部排序)降低内存的使用量:因为reduce阶段需要分组,将key相同的放在一起进行规约,使用了两种算法:hashmap和sort,如果在reduce阶段sort排序(内部排序),太消耗内存,而map阶段的输出是要溢写到磁盘的,在磁盘中外排可以对任意数据量分组(只要磁盘够大),所以,map端排序(shuffle阶段),是为了减轻reduce端排序的压力。
mapreduce发成了几次排序?都在什么时候?
第一次:kvbuffer溢写之前会先对内存中的文件根据key和partition进行排序。方式:快排
第二次:所有文件都经过map方法和kvbuffer后,所有的小文件会合并成file.out文件,合并过程中会进行第二次排序,用来保证该文件有序。整个文件会根据partition分成多个块,每个块内按照key值排序。方式:归并(归并排序的方式很适合做多文件合并排序,且归并排序是具有稳定性的排序方式)。
第三次:reduce拉取到的文件会进行合并,此时会再次进行排序。方式:归并。
第四次:最后阶段:使用了堆排作最后的合并过程。