1

我还在学习 MapReduce 框架,专门由 Hadoop 实现,我想知道是否可以对其进行修改以执行以下任务:

Map() 函数将发出 (key,value) 对,其键是大小为 2 的数组,例如 int[2]。我希望包含两个共同整数中的任何一个的每一对都映射到同一个减速器。

例如,如果 Map() 发出:([2,3],4),([2,4],5),([6,5],2),([5,7],1),那么 Reduce1 应该接收前两对,Reduce2 接收后两对(前两个共享 2,第二个共享 5)。这可以看作是一个连通分量问题,其中顶点是 int[] 中的整数,而边在同一个 int[] 中的任意两个整数之间共享。

4

1 回答 1

1

更改算法,您可能可以实现这一点 - 但您需要将每个边缘发射两次

对于您当前输出的每条边,您应该为两个顶点 ID 输出它们,修改输出值以包括另一条边、权重和可选的方向(如果边方向对您的算法很重要)。

所以代替这个:

([2,3],4)
([2,4],5)
([6,5],2)
([5,7],1)

输出这个(S 表示键是源,D 表示键是目标):

(2, [3, 4, S])
(3, [2, 4, D])
(2, [4, 5, S])
(4, [2, 5, D])
(6, [5, 2, S])
(5, [6, 2, D])
(5, [7, 1, S])
(7, [5, 1, D])

现在在你的 reducer 中,你将按顶点 ID 进行分组,并且能够迭代其他包含另一个顶点 ID、权重和方向的元组:

(2, [3, 4, S])
(2, [4, 5, S])

(3, [2, 4, D])

(4, [2, 5, D])

(5, [6, 2, D])
(5, [7, 1, S])

(6, [5, 2, S])

(7, [5, 1, D])

您仍然需要注意每条边可能会被处理两次,特别是如果边在两个顶点之间的两个方向上都存在。

于 2013-05-23T00:03:21.857 回答