MapReduce排序总结
【1】Hadoop默认的排序算法,只会针对key值进行排序,按照字典顺序排序 【2】二次排序,在一个数据文件中,首先按照key排序。在key相同的情况下,再按照value大小排序。难度在于要同时参考两列的数据,可以将一行中的两列值封装到bean中。实现WritableComparable接口,重写compareTo进行排序,指定比较规则,实现二次排序,具体可参见 博客 【3】全局排序 1、使用一个Reducer 优点:实现简单 缺点:没有利用分布式 2、重写Partioner类 通过重写Partition类,把key在一个范围内的发往一个固定的Reducer,这样在一个Reducer内key是全排序的,在Reducer之间按照序号也是排好序的。比如key代表的是一个年龄,可以把数据输出到10个Reducer。1-10岁之间发往第0个Reducer,11-20发往第2个Reducer,以此类推。但是这样做有两个缺点: 当数据量大时会出现OOM(内存用完了) 会出现数据倾斜 3、 TotalOrderPartitioner类 Hadoop提供 TotalOrderPartitioner 类用于实现全局排序的功能,并且解决了OOM和数据倾斜的问题。TotalOrderPartitioner类提供了数据采样器,对key值进行部分采样,然后按照采样结果寻找key值的最佳分割点