3

是否可以在连续的 reducer 和 mapper 之间共享一个值?

或者是否可以将第一个 reducer 的输出存储到内存中,第二个 mapper 可以从内存中访问它?

问题是,我写了一个像 Map1 -> Reducer1 --> Map2 --> Reducer2 这样的链式映射减速器。

Map1 和 Map2 正在读取相同的输入文件。

Reduce1 正在推导一个值,假设“X”作为其输出。

我需要'X' 和 Map2 的输入文件。

我们如何在不读取 Reduce1 的输出文件的情况下做到这一点?

是否可以将“X”存储在内存中以供 Mapper 2 访问?

4

2 回答 2

4

每个作业彼此独立,因此如果不将输出存储在中间位置,就不可能跨作业共享数据。

仅供参考,在 MapReduce 模型中,地图任务不会相互交谈。减少任务也是如此。在 Hadoop 上运行的Apache Giraph使用同一作业中映射器之间的通信来进行迭代算法,这需要在映射器之间一次又一次地运行相同的作业而无需通信。

不确定正在实现的算法以及为什么使用 MR,但每个 MR 算法也可以在BSP中实现。这是一篇比较 BSP 和 MR 的论文。与 MR 相比,一些算法在 BSP 中表现良好。Apache Hama是 BSP 模型的实现,就像 Apache Hadoop 是 MR 的实现一样。

于 2012-10-31T10:52:38.983 回答
1

如果 Reducer1 生成的不同行数很少(假设您有 10000 个 (id,price) 元组),则首选使用两阶段处理。您可以将第一个 map/reduce 的结果加载到每个 Map2 映射器的内存中并过滤输入数据。因此,不需要的数据不会通过网络传输,所有数据都将在本地处理。使用 combineres 的数据量可以更少。

如果有大量不同的行,您需要两次读取数据。

于 2012-10-31T12:04:48.767 回答