两个Mapreduce jobs并将每个job的reduced值连接到一个包含两个值的列表中

6psbrbz9  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(266)

我正在编写一个mapreduce程序,要求我查找一个节点(000-999)的入站和出站链接数,基本上是一个web图形处理器。我需要返回一个特定的节点作为键,返回每个文档的out degree和in degree作为值。例如
示例文本文件:

000 002
001 002
002 000
001 000

应返回:

000 1 2
001 2 0
002 1 2

按照我的逻辑,似乎需要创建两个map reduce作业,第一个传入一个值为节点对的longwritable键(例如000 002),计算每个节点的出站链接数,并在reducer阶段结束时返回(000 1)之类的值。然后,我将通过翻转节点对(例如,000002变为002000)并找到这些出站链接的计数(在上面的示例中,这将返回(0002))来查找文档的in度。然后我需要将这些值组合起来,得到(00012)的最终输出。创建两个Map作业并以某种方式将这两个值合并到一个包含两个值的列表中的最佳方法是什么?如果我使用java(而不是hive)来编写代码,有没有方法连接这些值?有没有更简单更有效的方法来解决这个问题?
edit:对于这个程序,mapper功能是相同的,因为我只是切换两个值(000002到002000),以便以完全相同的方式计算入站路径和出站路径。reducer函数也完全相同,但它需要在两个单独的作业上运行,因此我不会将最终值作为in degree和out degree的和。我需要返回in度数,然后返回out度数并将它们附加到值列表中。

tez616oj

tez616oj1#

假设你想做其他的事情,然后计算一个给定顶点的度数,我推荐使用jgrapht,一个java类库,它为图论提供对象和算法。
将indegreeof视为解决问题的方法。

bnlyeluc

bnlyeluc2#

我的建议是使用一个复杂的字符串生成一个更复杂的中间格式。所有您可能需要的是形成一个csv格式为您的减速机。
对于到reducer的每一行,在输入的第一行中将有两个不同的节点:000和002。用“#”分隔字符串,例如:

context.write(new Text("000"),new Text("LeftToRight#1"));
context.write(new Text("002"),new Text("RightToLeft#1"));

稍后在reducer中,您可以分别计算所有lefttorights和righttoleft,并为它们生成一个输出。
要在单个文件中获得输出:请将“减速器数”设置为1。

相关问题