hadoop mapreduce有哪些地方使用了排序?

目录

    • 前言
    • 哪些排序?
      • 快速排序(默认;分区按key排序)
      • 归并排序(磁盘文件的归并排序)
      • GroupingComparator

前言

如题:hadoop mapreduce 整个过程中有哪些排序?这是个经典问题,且排序也是在大学学习《数据结构》这门课程中专门的一个章节,也是对排序以及其使用场景的加深

源码部分仍然是先学习hadoop 简单的MapReduce源码分析(源码&流程&word count日志) 一文,顺便也是复习

哪些排序?

回忆MapTask的流程,基本如下
hadoop mapreduce有哪些地方使用了排序?_第1张图片

且应当知道mapTask的输出,类似如下(按分区,且分区内key是按一定顺序的)

hadoop mapreduce有哪些地方使用了排序?_第2张图片

输入经过map处理后是写入到环形缓冲区的(P即分区号),可以参考实践 hadoop自定义分区&数据倾斜问题引入(仍然是wordcount 例子实践)

快速排序(默认;分区按key排序)

缓冲区达到一定阈值后,要溢出写入到磁盘文件中;因为数据是直接在内存中的,而我们是最后的输出是一个的有序输出文件,显然,这里在未写入磁盘之前,可以内存排个序

使用的sorter见MapTask源码中的init初始化方法

sorter = ReflectionUtils.newInstance(job.getClass(
                   MRJobConfig.MAP_SORT_CLASS, QuickSort.class,
                   IndexedSorter.class), job);

public static final String MAP_SORT_CLASS = "map.sort.class";, 即采

归并排序(磁盘文件的归并排序)

归并排序主要适用于内部有序,外无序的场景, 在多磁盘文件读取并合并成一个文件的过程中,显然很合适(归并排序在大数据的应用是很广泛的,它是稳定的nlogn)

GroupingComparator

在reduce阶段,拉取数据的进行reduce处理是通过迭代器模式的,先是context.nextKey()的判断,然后再获取Iterator; 每处理一条记录,读会判断是不是跟上次是一组的;如果是,则继续获取;如果不是,那么表示是新的一组了,reduce处理一组,并继续类似开始下一组。

默认是按照key的比较器,这里可以自定义GroupingComparator,例如:key是一个对象时,可能需要自定义实现下,那些对象是分在一组的

顺带复习下 reduceTask

hadoop mapreduce有哪些地方使用了排序?_第3张图片

你可能感兴趣的:(#,hadoop)