Map Reduce,reducer是否会自动排序?

时间:2018-11-08 18:46:29

标签: hadoop mapreduce reduce

关于MapReduce编程环境的功能视图,我还不清楚。

考虑从一个(或多个)映射器产生1k个形式为(单词1)的随机未排序单词。假设我要使用reducer将它们全部保存在一个巨大的排序文件中。如何运作?我的意思是,reducer本身会自动对所有单词进行排序?减速器功能应该做什么?如果我只有一个带有有限内存和磁盘的减速器怎么办?

1 个答案:

答案 0 :(得分:0)

enter image description here

当化简器获得数据时,该数据已经在地图侧进行了排序。

过程是这样的
地图侧面:
1.每个inputSplit将由map任务处理,并且map输出的结果将临时放置在循环内存缓冲区[SHUFFLE]中(缓冲区的大小默认为100M,由io.sort.mb控制)属性)。当缓冲区即将溢出时(默认值为缓冲区大小的80%),将在本地文件系统中创建一个溢出文件。
2.在写入磁盘之前,线程首先根据缩减任务的数量将数据划分为相同数量的分区,即,缩减任务对应于一个分区的数据。避免将某些归约任务分配给大量数据,即使没有数据也是如此。实际上,每个分区中的数据都是经过排序的。如果此时设置了合并器,则对排序结果进行合并器操作。
3.当本地任务输出最后一条记录时,可能有很多溢出文件,这些文件需要合并。在合并过程中,出于两个目的,将连续执行排序和合并操作:1.最小化每次写入磁盘的数据量; 2.在下一个复制阶段,最小化网络传输的数据量。最终合并到一个分区和排序的文件中。为了减少通过网络传输的数据量,您可以在此处压缩数据,只需将mapred.compress.map.out设置为true。
4.将数据从分区复制到相应的reduce任务。
减少边:
1.Reduce将接收来自不同地图任务的数据,并且将从每个地图发送的数据量进行排序。如果reduce端接受的数据量很小,则将其直接存储在内存中。如果数据量超过缓冲区大小的特定比例,则数据将合并并写入磁盘。
2.随着溢出文件数量的增加,后台线程会将它们合并为更大,更有序的文件。实际上,无论Map端还是reduce端,MapReduce都会重复执行排序和合并操作。
3.合并过程将生成很多中间文件(写入磁盘),但是MapReduce将使写入磁盘的数据尽可能小,并且最后合并的结果不会写入磁盘,而是直接输入减少功能。