2017-11-10 17 views
0

私はhadoopのために書いている小さなmap-reduceプログラムを持っています。プログラムの1つの要素はすべてのリストのペアを作成することです。プログラムの入力がある場合、例えば:hadoopの値リストのすべてのペアを作成する

item1 tag1 
item2 tag1 
item3 tag2 
item4 tag1 
item5 tag2 

マイマップ機能は<tag, item>ペアを作成するので、減速機は、その入力として<tag, List<item>>を受信します。

item1-item2 tag1 
item1-item4 tag1 
item2-item4 tag1 
item3-item5 tag2 

ので、本質的に、値のすべてのリストについては、すべての可能なペアを作成し、各ペアにキーを作るために:私の目標はする減速機から出力用です。
私はうまくいくソリューションを見つけましたが、リストをメモリにコピーしてそれを反復することに依存しています。私のデータセットが非常に大きくなる可能性があるので、これは問題になるかもしれません:

public void reduce(Text key, Iterable<Text> values, Context context) 
         throws IOException, InterruptedException { 

    List<String> list = new ArrayList<String>(); 
    for (Text t : values) { 
     list.add(t.toString()); 
    } 
    for (int i=0; i<list.size()-1; i++) { 
     for (int j=i+1; j<list.size(); j++) { 
      out.set(list.get(i) + "-" + list.get(j)) 
      context.write(out, one); 
     } 
    } 
} 

は、代替、またはHadoopの中でそれをやって、より効率的な方法はありますか?
私は各リストをメモリにコピーしたくありません。

私は別のmap-reduceステップを使用するような創造的なものを考え出してきましたが、動作するものを見つけることはできません。

ありがとうございました!

答えて

0

レデューサーはすべてのデータを取得しますが、データは実際にディスクに書き込まれ、繰り返し可能な値の反復処理を行うとメモリに取り込まれます。実際には、その反復によって返されるオブジェクトは各値に対して再利用されます。フィールドやその他の状態は、オブジェクトが手渡される前に単純に置き換えられます。

つまり、メモリ内のすべての値オブジェクトを同時に持たせるには、値オブジェクトを明示的にコピーする必要があります。

あなたのコードを見ると、アイテムのペアをメモリに保存していないようです。あなたは良いものになるはずですので、アイテムのペアを直接書き出しています。

関連する問題