4

特定の基準では、マッパーにすべての作業とHDFSへの出力を実行させ、データをレデューサーに送信しないようにします(余分な帯域幅を使用します。間違っている場合は修正してください)。

擬似コードは次のようになります。

def mapper(k,v_list):
  for v in v_list:
    if criteria:
      write to HDFS
    else:
      emit

私たちが遊ぶことができるのはOutputCollectorだけなので、私は難しいと感じました。私が考える1つのことは、OutputCollectorを拡張し、OutputCollector.collectをオーバーライドして、処理を実行することです。より良い方法はありますか?

4

4 に答える 4

3

JobConf.setNumReduceTasks(0) を使用して、reduce タスクの数を 0 に設定するだけです。これにより、マッパーの結果が直接 HDFS に送られます。

Map-Reduce マニュアルから: http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html

Reducer NONE
It is legal to set the number of reduce-tasks to zero if no reduction is desired.

In this case the outputs of the map-tasks go directly to the FileSystem, 
into the output path set by setOutputPath(Path). The framework does not sort 
the map-outputs before writing them out to the FileSystem.
于 2012-04-24T00:39:22.250 に答える
1

ストリーミングを使用していると仮定していますが、その場合、これを行う標準的な方法はありません。

Java Mapper では確かに可能です。ストリーミングの場合は、PipeMapper Java ファイルを修正するか、独自の出力コレクターを作成する必要がありますが、それほど問題が発生する場合は、Java マッパーを作成するだけで十分です。

于 2012-05-10T03:17:20.063 に答える
0

HDFS に何かを書き込もうとしている場合、Reducer に何かを送信しなくても、実際には帯域幅を節約できない可能性があります。HDFS はまだ他のノードに複製されており、複製が行われようとしています。

ただし、マッパーからの出力を書き込む正当な理由は他にもあります。これについてはFAQがありますが、できるということ以外は詳細が少し不足しています。

ここであなたの質問と重複している可能性のある別の質問を見つけました。この質問には、Java で Mapper を作成している場合に役立つ回答があります。これをストリーミング方式で行おうとしている場合は、スクリプトで hadoop fs コマンドを使用するだけで実行できます。

于 2012-08-16T14:31:37.877 に答える