Hadoop实现Secondary Sort
在hadoop中每个reduce的输入的key都是有序的,而value则是无序的。而且同一个job运行多次,由于map完成顺序不同,reduce收到的value顺序是不固定的。那如何才能实现reduce收到有序的value呢?这就需要Secondary Sort。
Secondary Sort要解决的问题:reduce收到的value有序。
这里举一个场景,来说明Secondary Sort是如何实现的。假设我们有若干公司若干部门的人数,数据样例如下:
?
?
公司名?? 部门的人数Taobao 52
Taobao 31
Taobao 67
Alipay 10
Alipay 36
Alipay 29
B2B 120
B2B 72
Aliyun 13
Aliyun 32
Aliyun 3
我们想知道每个公司的最大部门(人数最多)的人数。即希望先按公司名group,然后对group内的人数降序排列,最后取每个group的第一个即可。
由于reduce收到的value是无序的,所以要对value进行排序,首先需要将value封装到key里面。即需要自定义key的类型,代码如下:
?
}???
对于输入如下内容的文件:
?
$ bin/hadoopfs?-cat?/liangly/list
Taobao?52
Taobao?31
Taobao?67
Alipay?10
Alipay?36
Alipay?29
B2B 120
B2B 72
Aliyun 13
Aliyun 32
Aliyun 3
执行上面实现的Job:?
$ bin/hadoopjar job.jar?MySecondarySort?\
> -Dmapred.map.tasks=3?\
> -Dmapred.reduce.tasks=2?\
>?/liangly/list?\
>?/liangly/out
作业结束后输出如下:?
$ bin/hadoopfs?-cat?/liangly/out/*
Alipay??36
Aliyun?32
B2B????120
Taobao??67由于数据量很小,很容易确定已经达到了预期目的。