2

異なる出力ファイルを作成するための MultipleOutputs と FSDataOutputStream と Task Side Effect File の利点/違いを知りたいですか?

a. MultipleOutput の使用:

MultipleOutputs mos;

void configure()
{
    mos.new MultipleOutputs(conf);
}

reduce()
{
    mos.getCollector("desired_path", reporter).collect(new Text(key), new Text(val));
}

b. FSDataOutputream を使用して、次のようにファイル システム内の目的のパスに出力を書き込みます。

    void configure()
   {
       fs = FileSystem.get(conf);
   }


    void reduce()
   {

       Path op = "/custom_path";
   FSDataOutputStream dst = fs.create(op);
   dst.writeBytes(t+" "+uidi+" "+str_sizeval); 
   }            

c. タスクの副作用ファイルの使用。ここでは、カスタムの目的のパスを使用する代わりに、上記のように FSDataOutputStream を使用して、FileOutputFormat.getWorkOutputPath() によって返されたパスに出力を書き込みます。

出力パス以外のパスに目的の出力を書き込む最良の方法はどれですか?

4

1 に答える 1

2

a と c は多かれ少なかれ同じものであり、出力コミッターによって管理されるという点で b よりも明確な利点があります。

b を投機的実行と組み合わせて使用​​すると、エラー (2 つのものが同じファイルに書き込もうとする) が発生するか、結果が破損する可能性があります。

a & c には、HDFS の一時的なタスク試行フォルダーに出力しているため、この問題はありません。タスクの試行がコミットされると、そのコンテンツは実際の出力フォルダーに移動されます (したがって、投機的実行で問題が発生することはありません)。 .

a は、ファイルの一意性を管理しているため、c よりも優れたオプションです。各ファイルには、追加のタスク ID が付けられます (たとえば、「desired_pa​​th-r-00000」の場合)。c を使用し、2 つのレデューサーが同じ失敗名に書き込む場合、コミットする最後のタスクがコミットされた最初のタスクの内容を上書きするか、エラーが発生します (どちらかはわかりません)。

つまり、a が最適なオプションです。

于 2013-01-19T12:55:54.563 に答える