本篇我们简单学习下Hadoop如何使用MapReduce进行全局排序?
首先MapReduce其过程本身中就有排序,那么其排序原理是怎样的?我们先了解其排序原理后,再考虑是否可以加以利用从而进行全局排序。
1、mapreduce中的排序原理:
hadoop中默认按照key值进行排序的,且是按照字典顺序进行排序的。
我们知道mapreduce进程中数据的流动最简单的形式就是map>reduce,
也就是说把所有数据都丢给map阶段,然后全部又扔给1个reduce,利用hadoop其shuffle机制对所有数据进行排序,再由reduce输出结果。但是这样只有1个reduce的方案和单机是没有区别的,不能体现出分布式计算的优势。
为此,我们需要引入partitioner,将map的结果送往指定的reducer,数据流动形式为:map>partition>reduce,可以实现指定多个reducer进行分布式计算,如何分多个partition并确保partition有序我们等会会结合实践来说。
我们还可以在此基础上增加一次对reduce优化的过程,即使用combiner,(有的情况不能使用),此时数据流这样:map>combine>partition>reduce过程。
2、实践
举例:两个文件a.txt & b.txt,其中的内容分别如下:
a.txt数据:
1 map
3 map
5 map
…
99 map
b.txt数据:
0 reduce
2 reduce
…
100 reduce
要实现排序后数据如下: