一、WritableComparable是一个接口,它继承了hadoop自己封装的序列化类
Writable和java中的Comparable接口。
1、 源码如下:
public interface WritableComparable <T> extends org.apache.hadoop.io.Writable, java.lang.Comparable<T> |
public interface Writable { void write(java.io.DataOutput dataOutput) throws java.io.IOException; void readFields(java.io.DataInput dataInput) throws java.io.IOException; } |
public interface Comparable<T> { public int compareTo(T o); } |
2、writableComparable排序
排序是Mapreduce框架中重要的操作之一,Maptask和reduce task 均会对数据(按照key值)排序。
默认排序是按照字典排序,且实现排序的方法是快速排序。
1)maptask对文件的排序,在缓冲区满后写入磁盘之前,对数据进行排序。写入磁盘之后,
他对磁盘所有文件进行一此合并,将这些文件合成一个有序的文件。
2)reducetask,从maptask远程拷贝数据文件,小文件放在内存中,达到一定阈值则放在磁盘上 。
内存中的文件数目或者大小达到一定阈值,则进行合并后写入磁盘中。
磁盘上文件数目达到一定阈值,则进行一次合并生成更大的文件。
当所有数据拷贝完成后,reducetask 统一对内存和磁盘上的所有数据进行合并。
3、排序的分类
①部分排序:MapReduce根据输入记录的键对数据集排序。保证每个文件内部排序
②全排序:
首先创建一系列排好序的文件;其次,串联这些文件;最后,生成一个全局排序的文件。主要思路是使用一个分区来描述输出的全局排序。例如:可以为上述文件创建3个分区,在第一个分区中,记录的单词首字母a-g,第二个分区记录单词首字母h-n,第三个分区记录单词首字母o-z。
③辅助排序:(groupCompator)
Mapreduce框架在记录到达reducer之前按键对记录排序,但键所对应的值并没有被排序。甚至在不同的执行轮次中,这些值的排序也不固定,因为它们来自不同的map任务且这些map任务在不同轮次中完成时间各不相同。一般来说,大多数MapReduce程序会避免让reduce函数依赖于值的排序。但是,有时也需要通过特定的方法对键进行排序和分组等以实现对值的排序。
④二次排序
在自定义排序过程中,如果compareTo中的判断条件为两个即为二次排序。