【问题标题】:Map Reduce, does reducer automatically sorts?Map Reduce,reducer会自动排序吗?
【发布时间】:2019-04-12 08:17:42
【问题描述】:

关于 MapReduce 编程环境的整体功能视图,我有一些不清楚的地方。

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

【问题讨论】:

    标签: hadoop mapreduce reduce


    【解决方案1】:

    reducer 拿到数据时,数据已经在 map 端排序了。

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

    【讨论】:

      猜你喜欢
      • 2016-10-25
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 2017-02-17
      • 1970-01-01
      • 2018-06-17
      相关资源
      最近更新 更多