4

Hadoop the definitive guide (Tom White) Page 178 Section shuffle and sort : The map side. Just after figure 6-4

Before it writes to disk , the thread first divides the data into partitions corresponding to the reducers that they will ultimately be sent to. WIthin each partition, the background thread performs an in-memory sort by key and if there is a combiner function, it is run on the output of the sort.

Question :

Does this mean the map writes each key output to a different file and then combine them later. Thus if there were 2 different key outputs to be sent to a reducer , each different key will be sent seperately to the reducer instead of sending a single file.

If my above reasoning is incorrect, what is it that actually happens.

4

3 回答 3

4

仅当两个关键输出进入不同的减速器时。如果分区认为他们应该去同一个减速器,他们将在同一个文件中。

- 更新以包含更多细节 - 主要来自书中:

分区器只是将键排序到桶中。0 到 n 表示您工作中的减速器数量。reduce 任务有少量的复制线程,因此它可以并行获取映射输出。因此,对于给定的作业,jobtracker 知道地图输出和主机之间的映射。reducer 中的一个线程会定期向 master 请求 map 输出主机,直到它全部检索到它们为止。

如果映射输出足够小,则将其复制到 reduce 任务 JVM 的内存(缓冲区的大小由 mapred.job.shuffle.input.buffer.percent 控制,它指定用于此目的的堆的比例);否则,它们将被复制到磁盘。当内存缓冲区达到阈值大小(由 mapred.job.shuffle.merge.percent 控制)或达到映射输出的阈值数量(mapred.inmem.merge.threshold)时,它被合并并溢出到磁盘。如果指定了组合器,它将在合并期间运行以减少写入磁盘的数据量。

随着副本在磁盘上的累积,后台线程会将它们合并为更大的、已排序的文件。这节省了稍后合并的时间。请注意,必须在内存中解压缩(由 map 任务)压缩的任何 map 输出,以便对它们执行合并。

当所有映射输出都被复制后,reduce 任务进入排序阶段(应该正确地称为合并阶段,因为排序是在映射端进行的),它合并映射输出,保持它们的排序顺序。这是轮流进行的。例如,如果有 50 个地图输出并且合并因子为 10(默认值,由 io.sort.factor 属性控制,就像在地图的合并中一样),则将有五轮。每轮将 10 个文件合并为一个,所以最后会有 5 个中间文件。

与将这五个文件合并为一个排序文件的最后一轮不同,合并通过在最后一个阶段:reduce 阶段直接提供 reduce 函数来节省磁盘行程。这个最终的合并可以来自内存和磁盘段的混合。

于 2013-06-08T15:41:56.167 回答
1

比如说,你有 3 个减速器在运行。然后,您可以使用分区器来决定哪些键进入三个减速器中的哪个。您可能可以在分区器中执行 X%3 来决定哪个键进入哪个减速器。Hadoop 默认使用HashPartitioner。

于 2013-06-10T06:20:20.797 回答
1

如果我们配置了多个reducer,那么在分区的时候,如果我们得到不同reducer的key,它们会被存储在reducer对应的单独文件中,并且在map任务结束时完整的文件将被发送到reducer而不是单个key。

于 2013-06-09T08:27:24.447 回答