Hadoop 有向图中的MapReduce长度3路径

Hadoop 有向图中的MapReduce长度3路径,hadoop,graph,mapreduce,Hadoop,Graph,Mapreduce,我试图解决一个练习,但我仍然没有找到解决方案 设计一个MapReduce算法,该算法将给定一个以弧列表表示的有向图作为输入,列出所有节点对(x,y),从而存在三条弧(x,a)、(a,b)和(b,y)。还原器接收到的值列表的长度决不能超过图中的节点数。请提供伪代码 因此,我通过以下方式找到了长度为2的路径: map (k, v): write (k, (v, "out")) write (v, (k, "in")) reduce(k ,list(v)): // write a

我试图解决一个练习,但我仍然没有找到解决方案

设计一个MapReduce算法,该算法将给定一个以弧列表表示的有向图作为输入,列出所有节点对(x,y),从而存在三条弧(x,a)、(a,b)和(b,y)。还原器接收到的值列表的长度决不能超过图中的节点数。请提供伪代码

因此,我通过以下方式找到了长度为2的路径:

map (k, v): 
   write (k, (v, "out"))
   write (v, (k, "in"))

reduce(k ,list(v)):
   // write all pairs of nodes such that one has an arc exiting and the other has an arc entering

但从现在起,我无法理解如何找到长度为3的路径,以满足列表长度的属性。

我不擅长hadoop语法,但让我们从理论上解决这个问题

考虑G=(V,E)-弧是我们的,E包含(x,a)、(a,b)、(b,y)等元素

您找到了一种提取距离为2的所有节点的方法。让我们把这个集合称为2-LEN。在您的简短示例中,它将包含(x,b)和(a,y)

让我们创建如下定义的新集合(伪代码):

正如您可能理解的,第三个参数是距离。 现在,对于您的示例,新的_集将包含:(x,a,1),(a,b,1),(b,y,1),(x,b,2),(a,y,2)

现在,在您的2距离算法中使用相同的逻辑-mapreduce NEW_集合:

map(k,v,d):
   write (k, (v, "out", d))
   write (v, (k, "in" , d))

reduce(k , list (v)):
   //write all pairs of nodes such that one has an 'in' and the other has an 'out' AND have different d
对于地图后面的示例,我们将有以下内容:

  • (x,(a,out,1))
  • (a,(x,in,1))
  • (a,(b,out,1))
  • (b,(a,in,1))
  • (b,(y,out,1))
  • (y,(b,in,1))
  • (x,(b,out,2))
  • (b,(x,in,2))
  • (a,(y,out,2))
  • (y,(a,in,2))
现在,将2个距离节点与1个距离节点连接起来,得到距离为3的所有对

请注意,您将需要在该集合上执行uniq,因为您将获得(x,y)两次-一次来自((x,a)、(a,y)),一次来自((x,b)、(b,y))


正如我所提到的,我并不擅长hadoop语法,但我相信应该有一种方法来实现它。

如果您能够为长度2这样做,那么为什么不将它们添加到具有类型2的原始Arc列表中,并执行另一个map reduce(以查找长度2)但是这次强制reduce使用类型1和类型2,对于一条长度为3的路径,它们将是相等的?@DavidWinder是的,我认为这就是重点,但是我应该如何管理密钥?如何根据地图中的键进行分组?谢谢,我认为这是一个很好的解决方案。我没有想过把距离为1的圆弧和距离为2的圆弧放在一起。
map(k,v,d):
   write (k, (v, "out", d))
   write (v, (k, "in" , d))

reduce(k , list (v)):
   //write all pairs of nodes such that one has an 'in' and the other has an 'out' AND have different d