ITPub博客

首页 > 大数据 > Hadoop > MapReduce优化之字节级别快速排序

MapReduce优化之字节级别快速排序

原创 Hadoop 作者:破棉袄 时间:2015-06-10 17:28:23 0 删除 编辑

MapReduce默认使用RawComparator对map的输出键进行比较排序。内置的Writable类(例如Text和IntWritable)是字节级实现。这样不用将字节形式的类解排列(unmarshal)成类对象。如果要通过WritableComparable实现自定义Writable,就有可能延长洗牌和排序阶段的时间,因为它需要进行解排列。 

问题:
    存在自定义的Writable。需要减少作业的排序时间。 


方案:

    实现字节级的Comparator来优化排序中的比较过程。


解决:
 RawComparator接口提供两个方法:

1.public int compare(WritableComparable w1, WritableComparable w2){}
2.public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {}
采用第一种方法简单、易实现,但其性能也是我们需进行优化的原因。那么,让我们实现第二种:

实例:
假设我们定制的Writable为两个String的封装:



我们知道DataOutput.writeUTF方法会首先用两个字节保存字符串的长度,然后再保存该字符串。

OK,接下来,让我们看该如何实现快速排序:

1.实现一个RawComparator接口,但这里我们只需继承WritableComparator 即可
    WritableComparator 是RawComparator 的一个通用实现。它提供了一个compareBytes方法实现字节级排序。

2.定制一个对象继承WritableComparator,实现以下方法:
  
先说一下compare的参数:
   b1字段包含一个字节数组,其中包括字节形式的WritableComparable。
   s1字段是指WritableComparable对象起始字节的偏移量。
   l1字段是指WritableComparable在字节数组中占用的字节数。

readUnsignedShort方法为获取从起始偏移量开始的前两个字节,该两个字节保存的为字符串的长度。

OK,排序完成。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29754888/viewspace-1694667/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: CopyField 的作用
请登录后发表评论 登录
全部评论

注册时间:2014-07-16

  • 博文量
    180
  • 访问量
    1158159