2

私は、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つの仕事で行わなければならないと思います。

  1. 最初のジョブは、各ユーザーの編集済みページのリストを抽出します。

    # userId pageId1,pageId2,...
    10 1,2,3
    11 1,4
    
  2. 2番目のジョブは上記の出力を受け取り、各ユーザーが編集したページのすべてのペアを生成します(したがって、これらのページは同じユーザーによって編集されているため、グラフにリンクされます)。ボーナスとして、各エッジの重みを取得するために、実際に各ページを共同編集したユーザーの数を数えることができます。

    # pageId1,pageID2 weight
    1,2 1
    1,3 1
    1,4 1
    2,3 1
    

これをHadoopを使用して実装しましたが、機能します。問題は、2番目のジョブのマップフェーズが非常に遅いことです(実際には、最初の30%は問題ありませんが、その後はかなり遅くなります)。私が思いついた理由は、一部のユーザーが多くのページを編集しているため、マッパーはこれらのペアの多くを出力として生成する必要があるためです。したがって、Hadoopはディスクに流出する必要があり、全体がかなり遅くなります。

したがって、私の質問は次のとおりです。

  1. 私よりもHadoopの経験が豊富な方へ:私は間違っているのでしょうか?このグラフを抽出する簡単な方法はありますか?
  2. ディスクの流出が、2番目のジョブのマップフェーズがかなり遅い理由になる可能性がありますか?どうすればこれを回避できますか?

サイドノードとして、これは編集の小さなサンプルで正常に実行されます。GBのデータでのみ遅くなります。

4

1 に答える 1

0

どうやら、これは組み合わせ/相互相関/共起として知られる一般的な問題であり、Map/Reduce、Pairs、または Stripes を使用して解決する 2 つのパターンがあります。

私が質問で提示した方法は、通常、より多くのデータを生成するペア アプローチです。ストライプアプローチは、コンバイナーからより多くの恩恵を受け、私の場合はより良い結果をもたらしました.

于 2013-02-26T10:09:31.227 に答える