读书人

Hadoop兑现Secondary Sort

发布时间: 2012-09-27 11:11:17 作者: rapoo

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的类型,代码如下:

?

}??
  • </span>??
    注意由于输入格式是key+空格+value,这里采用KeyValueTextInputFormat,避免了map中做分割字符串操作。

    ?

    对于输入如下内容的文件:

    ?

    $ 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

    由于数据量很小,很容易确定已经达到了预期目的。

  • 读书人网 >软件开发

    热点推荐