前10个路径缩减图减少

时间:2013-10-18 05:37:36

标签: hadoop graph mapreduce bigdata scalding

我正在开发一个需要路径导航图的项目。

问题描述: 为了给出项目上下文,示例UI应该看起来类似于:http://bl.ocks.org/mbostock/4063570 不同之处在于它将用于网站导航。我的问题是处理后端的数据。

对于用户路径A-> B-> C-> D-> E 我预先计算的数据格式如下所示:

Origin:Start:End:Level
A  A  B  L1
A  B  C  L2
A  C  D  L3
A  D  E  L4

现在,假设我拥有数百万条这样的100条起源记录,我可以将它们分组,汇总大小并按大小desc排序并占据前10位。所以对于每个来源,开始和级别,我应该有10个记录每个。 因此,对于4个级别的图形,对于图形中的给定起始节点,我将有10 .. 10 ^ 2 .. 10 ^ 3 .. 10 ^ 4。

真正的问题: 排序后的前10名不能带走所有不需要的L3和L4。对于给定的原点,L1的结尾应该是L2的开始,L2的结尾应该是L3的开始,依此类推。由于这个原因,我有许多记录,其中许多L2启动不属于L1端,并且随着级别增加而倍增。 插图:

A  A  B  L1
A  B  C  L2
A  F  G  L2   <-- this comes in top 10 after aggregation, but start is not the end of L1 (B in this case)

我尝试了什么:在排序和切片前10后,我在每个级别1到1进行数百万条记录的自我加入。我有10个级别。它在计算上非常昂贵。

我在寻找什么: 通用且较便宜的Map-reduce解决方案。如果我能在烫伤环境中得到它,那就更好了。

1 个答案:

答案 0 :(得分:2)

我在这里有解决方案,但我不确定它是否适合您:

我想你想要做的就是拿走所有不需要的记录,如:

A A B L1

A B C L2

A F G L2(不适合,带走,因为从A到F没有从L2开始)

因此,当拿走一些不需要的记录时,我们必须知道记录是否是必需的;我给出的解决方案如下:

首先我们必须有一个内存数据结构DB(类似Redis或Hazelcast);在第一个MapReduce中,我们什么都不做,只是将数据插入到内存数据结构DB中;我们在这里插入的是地图数据(关键是开始:级别如A:L1 B:L5,值是List,这是结束)

所以地图可能是这样的:

A:L1-&GT;乙

A:L2-> C G

在第一个MapReduce之后,我们将知道所有必需的记录,因为我们有InMemoryDB; 第二个MapReduce我们取出了不适合的记录;

我们可以在映射器中像A F G L2这样的记录,我们在InMemoryDB中查询Map,就像getList一样使用密钥A:L1(使用这个,因为我们这里在L2处开始形式A)是List中的F;如果F是In,则需要,如果不是,则