一、可排序的Key
- 排序是MapReduce框架中最重要的操作之一
- MapTask和ReduceTask均会对数据按照Key进行排序;
- 该操作数据Hadoop的默认行为,任何应用程序中的数据均会被排序,而不管逻辑上是否需要;
- 默认排序是按照字典顺序排序,且实现该排序的方法是快速排序。
- 对于MapTask
- 它会将处理的结果暂时存放到环形缓冲区中,当环形缓冲区使用率达到一定的阈值后,再对环形缓冲区中的数据进行一次快速排序;
- 并将这些有序数据溢写到磁盘上;
- 而当数据处理完毕后,他会对磁盘上所有的文件进行归并排序。
- 对应ReduceTask
- 它从每个执行完成的MapTask上远程拷贝相应的数据文件,如果大小超过一定的阈值,则溢写到磁盘上,否则存储在内存中;
- 如果磁盘上的文件数目达到一定的阈值,则进行一次归并排序以生成一个更大的文件;
- 如果内存中文件大小或者数目超过一定的阈值,则进行一次合并后将数据溢写到磁盘上;
- 当所有数据拷贝完毕后,ReduceTask同一对内存和磁盘上的所有数据进行一次归并排序。
二、排序的种类
- 部分排序
- MapReduce根据输入记录的键值对数据集排序,保证输出的每个文件内部有序。
- 全排序
- 最终数据结果只有一个文件,且文件内部有序。实现方式是只设置一个ReduceTask,但该方法在处理大型文件时效率极低(发生了数据倾斜),因为一台机器处理所有文件,完全丧失了MapReduce所提供的并行架构。
- 辅助排序
- 在Reduce端对key进行分组,应用于在接收的key为bean对象时,想让一个或几个字段相同(全部字段比较不相同)的key进入到一个reduce方法时,可以采用分组排序。
- 二次排序
- 二次排序:mr编程中,需要先按输入数据的某一列a排序,如果相同,再按另一个列b排序;
- mr自带的类型作为key无法满足需求时,往往需要自定义javabean作为map输出的key;
- javabean中,使用compareTo方法指定排序的规则。