1

タイトルが言ったように、map-reduce に関するタスク デザインがあります。

考えた結果、部分的なデータ (おそらく 10% のデータ) のみをレデューサーに送信する必要があり、残りのデータは HDFS に直接出力するだけでよいと考えました。最後に、マッパーとリデューサーからのこれら 2 つの出力ファイルを結合するだけです (この合計データについて、統合されたファイルまたはディレクトリを取得する必要があります)。これを行うことで、このタスクの実行にかかる帯域幅のコストを削減できると思います。

それで、私の考えは実行できますか?(マッパーから HDFS に直接出力する方法は知っていますが、これには HDFS への出力とレデューサーへのデータの送信の両方のマッパーが必要です)

4

1 に答える 1

1

1 つの解決策は、MultipleOutputs の write() メソッドをファイルの 90% に使用し、残りの 10% にcontext.write()はマッパーの法線を使用して、レデューサーのみに行くようにすることです。

MultipOutputs のこの関数を使用できます -

void write(K key, V value, String baseOutputPath);

2 番目の解決策は、Mapper がファイルの 90% を HDFS に出力するためにFileSystem (Hadoop Api から) を直接使用することです。しかし、多くのマッパーを実行している場合、それがどれほど効率的かはわかりません。同じことが上記の MultipleOutput にも当てはまります -

何かのようなもの:

マッパーのsetup()関数でこれを行います -

FileSystem fs = file.getFileSystem(context.getConfiguration());
FSDataOutputStream fileOut = fs.create(new Path("your_hdfs_filename"));

map()関数内でこれを行います -

create()関数は FSDataOutputStream オブジェクトを返します。write( ) 関数を使用して、ファイルに書き込みます。

完了したら、 cleanup()関数で FileSystem オブジェクトを閉じます。何かのようなもの -fs.close();

于 2013-08-06T04:30:45.600 に答える