我正在尝试使用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/还原方面的Maven,但我认为这必须在两项工作中完成:
第一个作业为每个用户提取已编辑页面的列表。
# 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实现了这一点,而且很有效。问题是第二个作业的map阶段非常慢(实际上,前30%是可以的,但是之后会慢很多)。我想到的原因是,由于一些用户编辑了许多页面,Map器必须生成许多这样的对作为输出。因此hadoop必须溢出到磁盘,使得整个过程非常缓慢。
因此,我的问题如下:
对于那些在hadoop方面比我更有经验的人:我做错了吗?有没有更简单的方法来提取这个图?
磁盘溢出是第二个作业的map阶段非常慢的原因吗?我怎样才能避免这种情况?
作为一个侧节点,只需少量的编辑样本,就可以运行良好。它只会在有gbs数据的情况下变慢。
1条答案
按热度按时间k4ymrczo1#
显然,这是一个称为组合/互相关/共现的常见问题,使用map/reduce、pairs或stripes有两种模式可解决此问题:
Map减少设计模式:-成对和条纹
mapreduce模式、算法和用例(互相关部分)
成对和条纹
我在问题中提出的方法是pairs方法,它通常生成更多的数据。条纹方法从组合器中获益更多,在我的例子中给出了更好的结果。