哪些阶段存在排序
1. 在MapReduce的shuffle阶段共有三次排序,分别是:
- Map的溢写(spill)阶段:根据分区及key进行快速排序;
- Map合并溢写文件阶段:将同一个分区的多个溢写文件经过多轮归并排序最终合并为一个文件;
- Reduce输入阶段:将同一个分区,不同map task的数据文件进行归并排序
2. 在MapReduce的整个过程中,默认对输出的KV键值对按照key进行快速排序
-
Map输出排序:即map溢写排序
-
reduce输出排序:reduce输出时会对KV键值对按照key进行排序
补充:以上排序都是基于KV键值对的key进行排序的,键的排序顺序是由RawComparator控制,规则如下
(1)若属性mapred.output.key.comparator.class已经被显式设置,或者通过Job类的setSortComparatorClass()方法进行设置,则使用该类的实例
(2)否则,键必须是WritableComparable的子类,并使用针对该键类的已登记的comparator
(3)如果还没有已登记的comparator,则使用RawComparator将字节流反序列化为一个对象,再由WritableComparable的compareTo()方法进行操作
排序分类
局部排序
MapReduce中默认对于每个分区进行排序
完全排序
在所有的分区中,整体有序。如何实现全局排序,方法可参考
《MapReduce中实现全局排序方法》
辅助排序
辅助排序也成为二次排序,比如有时候我们不仅要对key进行排序,同时还要对value进行排序,如何实现二次排序,可参考
《MapReduce实现二次排序》