我正在尝试使用hadoop构建Wikipedia共同编辑页面的图形。原始数据包含编辑列表,即每个编辑有一行告诉谁编辑了什么:
# revisionId pageId userId
1 1 10
2 1 11
3 2 10
4 3 10
5 4 11
我想提取一个图表,其中每个节点都是一个页面,如果至少有一个编辑器编辑了两个页面(同一个编辑器),则两个页面之间存在链接。对于上面的示例,输出将是:
# edges: pageId1,pageId2
1,2
1,3
1,4
2,3
我远不是Map / Reduce的专家,但我认为这必须在两个工作中完成:
第一个作业为每个用户提取已编辑页面的列表。
# userId pageId1,pageId2,...
10 1,2,3
11 1,4
第二个作业采用上面的输出,并简单地生成每个用户编辑的所有页面对(这些页面因此由同一个用户编辑,因此将在图表中链接)。作为奖励,我们实际上可以计算每个页面共同编辑的用户数量,以获得每个边缘的权重。
# pageId1,pageID2 weight
1,2 1
1,3 1
1,4 1
2,3 1
我使用Hadoop实现了它,它可以工作。问题是第二个作业的地图阶段真的很慢(实际上,前30%是好的,但后来它减慢了很多)。我想出的原因是因为一些用户编辑了很多页面,映射器必须生成很多这些对作为输出。因此,Hadoop必须溢出到磁盘,使整个事情变得非常缓慢。
我的问题如下:
作为一个副节点,只需一小部分编辑就可以正常运行。只有GB的数据才会变慢。
答案 0 :(得分:0)
显然,这是一个常见的问题,称为组合/互相关/共现,并且有两种模式可以使用Map / Reduce,Pairs或Stripes来解决它:
我在问题中提出的方式是配对方法,它通常会生成更多数据。条纹方法从组合器中获益更多,并且在我的情况下给出了更好的结果。