私は、hadoopを使用してウィキペディアの共同編集ページのグラフを作成しようとしています。生データには編集のリストが含まれます。つまり、編集ごとに1つの行があり、誰が何を編集したかを示します。
# revisionId pageId userId
1 1 10
2 1 11
3 2 10
4 3 10
5 4 11
各ノードがページであり、少なくとも1人の編集者が両方のページ(同じ編集者)を編集した場合、2つのページ間にリンクがあるグラフを抽出したいと思います。上記の例の場合、出力は次のようになります。
# edges: pageId1,pageId2
1,2
1,3
1,4
2,3
私はMap/Reduceの専門家にはほど遠いですが、これは2つの仕事で行わなければならないと思います。
最初のジョブは、各ユーザーの編集済みページのリストを抽出します。
# userId pageId1,pageId2,... 10 1,2,3 11 1,4
2番目のジョブは上記の出力を受け取り、各ユーザーが編集したページのすべてのペアを生成します(したがって、これらのページは同じユーザーによって編集されているため、グラフにリンクされます)。ボーナスとして、各エッジの重みを取得するために、実際に各ページを共同編集したユーザーの数を数えることができます。
# pageId1,pageID2 weight 1,2 1 1,3 1 1,4 1 2,3 1
これをHadoopを使用して実装しましたが、機能します。問題は、2番目のジョブのマップフェーズが非常に遅いことです(実際には、最初の30%は問題ありませんが、その後はかなり遅くなります)。私が思いついた理由は、一部のユーザーが多くのページを編集しているため、マッパーはこれらのペアの多くを出力として生成する必要があるためです。したがって、Hadoopはディスクに流出する必要があり、全体がかなり遅くなります。
したがって、私の質問は次のとおりです。
- 私よりもHadoopの経験が豊富な方へ:私は間違っているのでしょうか?このグラフを抽出する簡単な方法はありますか?
- ディスクの流出が、2番目のジョブのマップフェーズがかなり遅い理由になる可能性がありますか?どうすればこれを回避できますか?
サイドノードとして、これは編集の小さなサンプルで正常に実行されます。GBのデータでのみ遅くなります。