Sort类——Hadoop

1、Sort是Map过程所产生的中间数据在送给Reduce进行处理之前要经过一个过程。首先,当map()函数处理完数据之后,会将中间数据存在本地的一个或几个文件中,并且针对这些文件内部的记录进行一次升序的快速排序。

2、然后在Map任务将所有的中间数据写入本地文件并进行快速排序之后,系统会对这些排好序的文件做一个归并排序,并将排好序的结果输出到一个大的文件中。

3、在Sort过程中,由Map过程所输出的中间文件会被拷贝到本地,然后生成一个或几个Segment类的实例segment.    Segment类封装了这些中间数据,并且提供了一些针对这些中间数据的操作,如读取记录等,同时系统还会启动两个merge线程,一个是针对内存的segment进行归并,一个是针对硬盘中的segment进行归并。merge过程实际上就是调用了Merge类的merge()方法。

4、Merge类的merge()方法生成了一个MergerQueue类的实例,并且调用了该类的merge()方法。MergeQueue类是PriorityQueue类的一个子类。PriorityQueue类实际上是一个小根堆,而MergeQueue类的merge()方法实际上就是将segment对象存储进父类的数据结构中,并且建立一个小根堆的过程。

5、针对segment排序的过程是以segment为单位,而这里排序过程中对两个segment对象的比较是对segment中存储的第一个记录的键的比较。由用户定义的comparator类定义具体的比较方法,并在MergeQueue类的lessThan方法中定义具体的比较过程。至此可以得到一个以segment为单位,以segment中第一个记录的键的比较依据的小根堆,也就完成了hadoopde Sort过程。

6、Sort类在默认情况下排序输出的大小次序是由小到大的(升序),如果程序需要将其改为由大到小的,可以重载接口函数。例如词频统计任务输出的key是单词,value是词频,为了实现按词频排序,我们指定使用InverseMapper类作为排序任务的Mapper类(sortJob.setMapperClass(InverseMapper.class);),这个类的map()函数简单地将输入的key和value互换后作为中间结果输出,,在本例中将词频作为key,单词作为value输出,这样就能得到按词频排好序的最终结果。不需要指定Reduce类,Hadoop会使用默认的IdentityReducer类,将中间结果原样输出。

7、hadoop默认对IntWritable按升序排序,然而有时候需要是按照降序排列,即按词频降序排列,这里我们可以通过实现一个IntWritableDecreasingComparator类,并指定使用这个自定义的Comparator类,对输出结果中的key进行排序,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值