0

Hadoop MapReduce 的一大好处是 Map 进程发生在它们操作的数据所在的同一台机器上(尽可能地)。但是这可能是,或者说这可能已经适用于 Reduce 方面吗?例如,在仅 Map 作业的极端情况下,所有输出数据最终都与相应的输入数据在同一台机器上(对吗?)。但是在输出与输出有些相关的中间情况下,对输出进行分区并尽可能将其保持在同一台机器上似乎是合理的。

这可能吗?这已经发生了吗?

4

2 回答 2

2

Reducers 的输入可以驻留在任何节点(本地或远程)上,而不必在运行它们的同一台机器上。随着 Mappers 的完成,它们的输出被写入它们正在运行的机器的本地 FS。完成此操作后,即将运行 reduce 任务的机器需要中间输出。这里要注意的一点是,与特定键对应的所有值都使用同一个 reducer。因此,Reducers 的输入并不总是可能是本地的,因为不同的键/值对集由运行在不同机器上的不同 Mapper 处理。

现在,在将 Mapper 输出发送到 Reducer 进行进一步处理之前,数据基于键进行分区,每个分区都转到一个 Reducer,该分区中的所有键/值对都由该 Reducer 处理。在此过程中会发生大量数据混洗。因此,在使用 Reducer 的情况下,无法维护数据局部性。

希望这能回答这个问题。

于 2013-09-14T19:55:07.393 回答
1

如果您知道特定 reducer 的数据在 map 阶段之后已经在正确的节点上,并且算法允许这样做(请参阅此博客文章),您应该将您的 reducer 作为组合器插入。组合器就像微型减速器,只能查看位于同一位置的数据。通常,您可以显着提高性能,因为组合器输出可能比映射输出小几个数量级,所以剩下的洗牌是微不足道的。

当然,如果 map 阶段确实让您的数据已经正确分区,为什么还要使用 reducer?为什么不创建第二个模拟减速器的地图作业?

于 2013-09-15T04:53:57.637 回答