是否可以自定义Hadoop的Shuffle / Sort(或分区)阶段以执行图遍历?

时间:2013-05-22 21:53:36

标签: hadoop mapreduce partitioning graph-traversal

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

Map()函数将发出(键,值)对,其键是大小为2的数组,比如int [2]。 我希望每个包含任意两个整数的对映射到同一个reducer。

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

1 个答案:

答案 0 :(得分: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])

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