我想我总体上对 MapReduce 编程模型有一个公平的理解,但是即使在阅读了原始论文和其他一些资料之后,我也不清楚许多细节,尤其是关于中间结果的划分。
我将快速总结一下到目前为止我对 MapReduce 的理解:我们有一个可能非常大的输入数据集,它被 MR-Framework 自动分成 M 个不同的部分。对于每一部分,框架都会安排一个地图任务,该任务由我的集群中的一个可用处理器/机器执行。M 个 map 任务中的每一个都输出一组 Key-Value-Pairs,它们本地存储在执行该 map 任务的同一台机器上。每台机器将其磁盘划分为 R 个分区,并根据分区之间的中间键分配其计算的中间键值对。然后,框架为每个不同的中间键启动一个 reduce 任务,该任务再次由任何可用机器执行。
现在我的问题是:
- 在某些教程中,听起来好像可以并行执行 map 和 reduce 任务。这是正确的吗?假设对于每个不同的中间键,只启动一个 reduce 任务,这怎么可能呢?我们不是必须等到最后一个 map 任务完成后才能开始第一个 reduce 任务吗?
- 由于我们每个不同的中间键都有一个reduce任务,每个reduce任务都需要执行机器从其他机器加载相应的分区是否正确?潜在地,每台机器都可以有一个带有所需中间键的键值对,因此对于每个 reduce 任务,我们可能必须查询所有其他机器。真的有效率吗?
- 原始论文说分区数(R)由用户指定。但是分区不是reduce任务的输入吗?或者更准确地说:所有机器中具有相同数量的所有分区的并集不是一个reduce任务的输入吗?这意味着,R 取决于用户通常不知道的不同中间键的数量。
从概念上讲,map 和 reduce 函数/任务的输入和输出是什么很清楚。但是我想我还没有在技术层面上理解 MapReduce。有人可以帮我理解吗?