MapReduce 中排序发生在哪几个阶段?这些排序是否可以避免?为什么?

2021-04-06 19:13发布

4条回答
20200921文 - 做更棒的自己!
2楼 · 2021-04-07 11:08

但是该方法在处理大型文件时效率极低,因为一台机器必须处理所有输出文件,从而完全丧失了MapReduce所提供的并行架构的优势。MapReduce过程其实有几个步骤在里面: partition(分区),sort(排序),shuffle(俗称洗牌),combine(合并)等细节。

三岁奶猫
3楼 · 2021-04-07 13:45
  1. 一个MapReduce作业由Map阶段和Reduce阶段两部分组成,这两阶段会对数据排序,从这个意义上说,MapReduce框架本质就是一个Distributed Sort。

  2. 在Map阶段,Map Task会在本地磁盘输出一个按照key排序(采用的是快速排序)的文件(中间可能产生多个文件,但最终会合并成一个),在Reduce阶段,每个ReduceTask会对收到的数据排序,这样数据便按照key分成了若干组,之后以组为单位交给reduce方法处理。

  3. 很多人的误解在Map阶段,如果不使用Combiner便不会排序,这是错误的,不管你用不用Combiner,MapTask均会对产生的数据排序(如果没有ReduceTask,则不会排序,实际上Map阶段的排序就是为了减轻Reduce端排序负载)。

  4. 由于这些排序是MapReduce自动完成的,用户无法控制,因此,在hadoop1.x中无法避免,也不可以关闭,但hadoop2.x是可以关闭的(将reducetask设置为0)。


1.map最后阶段进行partition分区,一般使用job.setPartitionerClass设置的类,如果没有自定义Key的hashCode()方法进行分区。在map阶段写出到环形缓冲区,在环形缓冲区溢写时会进行一次排序,每个分区内部调用job.setSortComparatorClass设置的key的比较函数类进行排序,如果没有则使用Key的实现的compareTo方法。


 


2.在归并每一个maptask的环形缓冲区的所有溢写文件的时候也会再次进行排序


 


3.当reduce接收到所有map传输过来的数据之后,对每一个分区的数据进行merge并排序,调用job.setSortComparatorClass设置的key比较函数类对所有数据对排序,如果没有则使用Key的实现的compareTo方法。


 


4.紧接着使用job.setGroupingComparatorClass设置的分组函数类,进行分组,同一个Key的value放在一个迭代器里面。如果未指定GroupingComparatorClass则则使用Key的实现的compareTo方法来对其分组。


 


Hadoop1.0中不可避免  hadoop2.0中可以关闭,将reducetask设置为0

MepReduce面试题:MapReduce中排序发生在哪几个阶段?这些排序是否可以避免?为什么?

猿小猿
5楼 · 2021-04-08 11:32

但是该方法在处理大型文件时效率极低,因为一台机器必须处理所有输出文件,从而完全丧失了MapReduce所提供的并行架构的优势。MapReduce过程其实有几个步骤在里面: partition(分区),sort(排序),shuffle(俗称洗牌),combine(合并)等细节