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

2021-04-06 19:13发布

5条回答

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中排序发生在哪几个阶段?这些排序是否可以避免?为什么?

一周热门 更多>