0

“hadoop权威指南-汤姆怀特”一书的摘要是:

用户的 map 函数和用户的 reduce 函数之间的所有逻辑都称为 shuffle。然后 Shuffle 跨越 map 和 reduce。在用户的 map() 函数之后,输出在内存循环缓冲区中。当缓冲区满 80% 时,后台线程开始运行。后台线程会将缓冲区的内容输出到溢出文件中。此溢出文件按键分区。并且在每个partition内,key-value对是按key排序的。排序后,如果combiner函数开启,则调用combiner函数。所有溢出文件将合并到一个 MapOutputFile。并且所有 Map 任务的 MapOutputFile 将通过网络收集到 Reduce 任务。减少任务将做另一种排序。然后将调用用户的 Reduce 函数。

所以问题是:

1.)根据上面的总结,这是流程:

Mapper--Partioner--Sort--Combiner--Shuffle--Sort--Reducer--Output

1a.) 这是流程还是其他?

1b.) 你能用一个例子解释一下上面的流程吗?

2.)所以映射器阶段输出是一个大文件(MapOutputFile)?是这个大文件被分解并且键值对被传递到各自的reducer吗?

3.) 当数据在传递到各自的 reducer 时已经排序和组合时,为什么要再次进行排序?

4.) 如果mapper1 在Datanode1 上运行,那么reducer1 是否需要在datanode1 上运行?或者它可以在任何 Datanode 上运行?

4

1 回答 1

0

回答这个问题就像改写整个历史。您的很多疑问都与操作系统概念有关,而不是 MapReduce。

  1. 映射器数据写入本地文件系统。数据根据reducer的数量进行分区。并且在每个分区中,根据溢出发生的次数,可以有多个文件。
  2. 给定分区中的每个小文件都被排序,就像在写入文件之前一样,在内存中排序完成。
  3. 为什么需要在映射器端对数据进行排序?a.在mapper端对数据进行排序合并,减少文件数量。b.文件被排序,因为在reducer上收集给定键的所有值是不可能的。
  4. 在 reducer 上收集数据后,首先需要减少系统上的文件数量(记住 uLimit 对每个用户都有一个固定的数量,在这种情况下是 hdfs)
  5. Reducer 只是在一小部分排序文件上维护一个文件指针,并对它们进行合并。

要了解更多有趣的想法,请参考: http ://bytepadding.com/big-data/map-reduce/understanding-map-reduce-the-missing-guide/

于 2017-04-05T16:41:17.580 回答