使用Hadoop的Wikipedia页面协同编辑图形提取

使用Hadoop的Wikipedia页面协同编辑图形提取,hadoop,mapreduce,wikipedia,Hadoop,Mapreduce,Wikipedia,我正在尝试使用hadoop构建维基百科共同编辑页面的图表。原始数据包含编辑列表,即每个编辑有一行,告诉谁编辑了什么: # 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/Redu

我正在尝试使用hadoop构建维基百科共同编辑页面的图表。原始数据包含编辑列表,即每个编辑有一行,告诉谁编辑了什么:

# 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必须溢出到磁盘,使得整个过程非常缓慢

    因此,我的问题如下:

  • 对于那些在Hadoop方面比我更有经验的人:我做错了吗?有没有更简单的方法来提取这个图
  • 磁盘溢出是第二个作业的映射阶段非常慢的原因吗?我怎样才能避免这种情况

  • 作为一个侧节点,只需少量的编辑样本,即可正常运行。它只会随着GB数据的增长而变慢。

    显然,这是一个常见的问题,称为组合/互相关/共现,使用Map/Reduce、Pairs或stripe有两种模式可以解决它:

    • (互相关部分)
    我在问题中提出的方法是配对方法,它通常会生成更多的数据。条纹方法从组合器中获益更多,并且在我的例子中给出了更好的结果