实现MapReduce全局排序有三种方法:
- 使用一个reduce实现全局排序
- 自定义分区函数实现全局排序
- 使用TotalOrderPartitoner进行全局排序
使用一个reduce实现全局排序
我们知道,MapReduce默认情况下只保证同一个分区中的key是有序的,不能保证全局有序。如果我们将所有的数据都用一个reduce来处理,就可以实现全局有序。
缺点:此方法的缺点也很明显,所有数据发送到一个reduce进行排序,不但不能充分利用集群的分布式资源,在数据量很大的情况下,很容易出现OOM的情况,效率也很低
自定义分区函数实现全局排序
MapReduce默认的分区函数为HashPartitioner,其具体的实现原理是计算map的输出key的hashCode值,然后用该值对reduce个数取余,不同的余数对应不同的reduce,余数相同的key将会被发送到同一个reduce中。
如果我们能够实现一个分区函数,使得
- 所以的key < 1000的数据都发送到reduce0;
- 所有1000 < key < 10000的数据都发送到reduce1;
- ……
- 其余的key都发送到reduceN;
这样就实现了reduce0的数据一定全部小于reduce1的数据,reduce1的数据全部小于reduce2的数据,……,同时每个redu