gpt4 book ai didi

hadoop - MapReduce 中的分区究竟是如何工作的?

转载 作者:可可西里 更新时间:2023-11-01 14:08:50 26 4
gpt4 key购买 nike

我认为我对 MapReduce 编程模型有一个大致的了解,但即使在阅读了原始论文和其他一些资源之后,我仍然不清楚许多细节,尤其是关于中间结果的分区。

我将快速总结一下到目前为止我对 MapReduce 的理解:我们有一个可能非常大的输入数据集,它会被 MR-Framework 自动分成 M 个不同的部分。对于每一 block ,框架都会安排一个映射任务,该任务由我的集群中的一个可用处理器/机器执行。 M 个 map 任务中的每一个都输出一组 Key-Value-Pairs,这些键值对存储在本地执行此 map 任务的同一台机器上。每台机器将其磁盘划分为 R 个分区,并根据中间键在分区之间分发其计算的中间键值对。然后,框架为每个不同的中间键启动一个 reduce 任务,该任务再次由任何可用机器执行。

现在我的问题是:

  1. 在一些教程中,听起来好像可以并行执行 map 和 reduce 任务。这是正确的吗?假设对于每个不同的中间键只启动一个 reduce 任务,那怎么可能呢?难道我们不必等到最后一个 map 任务完成后才能开始第一个 reduce 任务吗?
  2. 由于我们每个不同的中间键都有一个 reduce 任务,所以每个 reduce 任务都需要执行机器从其他机器加载相应的分区是否正确?潜在地,每台机器都可以有一个具有所需中间键的键值对,因此对于每个 reduce 任务,我们可能必须查询所有其他机器。这真的有效吗?
  3. 原始论文说分区数 (R) 由用户指定。但是分区不是 reduce 任务的输入吗?或者更确切地说:所有机器中具有相同编号的所有分区的并集不就是一个reduce任务的输入吗?这意味着,R 取决于用户通常不知道的不同中间 key 的数量。

从概念上讲,map 和 reduce 函数/任务的输入和输出是什么很清楚。但是我觉得我还没有在技术层面理解MapReduce。有人可以帮我理解吗?

最佳答案

  1. 您可以在 map 任务仍在运行时启动 reducer 任务(使用称为慢启动的功能),但 reducer 只能运行复制阶段(从已完成的 map 任务获取完成的结果。它需要等待让所有映射器在实际执行最终排序和归约之前完成。
  2. reduce 任务实际上处理零个、一个或多个键(而不是针对每个键的离散任务)。每个 reducer 都需要从与其分区相关的每个 map 任务中获取 map 输出,然后再对这些中间输出进行排序,然后一次减少一个键集。
  3. 回到 2 中的说明 - reducer 任务(每个分区一个)在零个、一个或多个键上运行,而不是为每个离散键运行一个任务。

理解中间键的散列和变化也很重要,因为它被散列和取模(如果使用默认的 HashPartitioner)以确定哪个 reduce 分区应该处理该键。假设您有偶数个 reducer 任务 (10),并且输出键总是散列为偶数 - 那么在这种情况下,这些散列数和 10 的模将始终为偶数,这意味着奇数编号的 reducer 将从不处理任何数据。

关于hadoop - MapReduce 中的分区究竟是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17734468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com