Hadoop的洗牌/排序(或分区)阶段是否可以自定义以执行图形遍历?



我还在学习MapReduce框架,特别是由Hadoop实现的,我想知道是否可以修改它来执行以下任务:

Map()函数将生成(key,value)对,其键是大小为2的数组,例如int[2]。我希望每一对包含两个公共整数中的任意一个都映射到同一个reducer。

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

改变算法,你可能会实现这一点-但你将需要发出每条边两次

对于你当前输出的每条边,你应该为两个顶点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])

现在,在您的减速器中,您将按顶点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])

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

相关内容

  • 没有找到相关文章

最新更新