mapreduce的核心主要是根据map的outputKey进行排序。排序分为内排序和外排序
内排是在堆内排序,主要是buffer在spill到文件中前进行排序,这个排序在map和reduce中都有这部分排序。
外排序是归并排序,是在将由buffer spill到磁盘的许多小文件进行合并时进行的排序,这个排序在map和reduce端都有涉及。
shuffle中的排序是指对map的outputkey和reduce的inputkey进行排序(及只对key进行排序),不对value进行排序。所以我们要写很多的Comparator,或者实现WritableComparator。
在哪些阶段我们需要关心key的比较呢?
1. 使Mapper的outputkey实现WritableComaprable,或者设置Comparator
2. job.setGroupingComparatorClass()
当然我们也需要关心shuffle阶段的 Partitioner
我们知道MapReduce,有个宏观的模式是 “分区(partioner)===》分组(grouping)”
1. partitioner 我们很清楚
2. 分组grouping 是在reduce部分(还有combiner部分)将key-value对进行分组,即产生key-list<value>对,作为reduce函数的输入
二次排序也是基于上述方法实现的