2

したがって、プログラムのJava作成に使用するmap/reduceと、マップはデータを収集し、レデューサーはキーごとの値のリストを受け取ります。

Map(k, v) -> k1, v1  
    then shuffle and sort happens  
    then reducer gets it  

reduce(k1, List<values>)  

取り組む。pythonしかし、を使用して同じことを行うことは可能streamingですか?これを参照として使用しましたが、reducerはコマンドラインで指定されたとおりに1行ごとにデータを取得するようです

4

4 に答える 4

5

これはあなたを助けることができるかもしれません。私はこれをapacheから見つけました...org

行をキー/値ペアに分割する方法のカスタマイズ前述のように、Map / Reduceフレームワークは、マッパーのstdoutから行を読み取るときに、行をキー/値ペアに分割します。デフォルトでは、最初のタブ文字までの行のプレフィックスがキーであり、行の残りの部分(タブ文字を除く)が値です。

ただし、このデフォルトはカスタマイズできます。タブ文字(デフォルト)以外のフィールド区切り文字を指定できます。また、キーと値の間の区切り文字として、行の最初の文字(デフォルト)ではなくn番目(n> = 1)の文字を指定できます。例えば:

$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-streaming.jar \
    -input myInputDirs \
    -output myOutputDir \
    -mapper org.apache.hadoop.mapred.lib.IdentityMapper \
    -reducer org.apache.hadoop.mapred.lib.IdentityReducer \
    -D stream.map.output.field.separator=. \
    -D stream.num.map.output.key.fields=4 

上記の例では、-D stream.map.output.field.separator=.「。」を指定します。マップ出力のフィールドセパレータとして、および4番目の「。」までのプレフィックスとして。行内がキーになり、行の残りの部分(4番目の「。」を除く)が値になります。行の「。」が4つ未満の場合、行全体がキーになり、値は空のTextオブジェクト(new Text( "")によって作成されたものなど)になります。

同様に、キーと値の間のセパレータとして、reduce出力の行のn番目のフィールドセパレータを使用-D stream.reduce.output.field.separator=SEPして指定できます。-D stream.num.reduce.output.fields=NUM

同様に、 map/reduce入力の入力セパレーターとしてstream.map.input.field.separatorとを指定できます。stream.reduce.input.field.separatorデフォルトでは、区切り文字はタブ文字です。

于 2012-01-09T08:19:26.200 に答える
1

PipeReducerは、Hadoopストリーミング用のレデューサー実装です。レデューサーはキー/値を取得し、それを繰り返して、キー/値ではなくキー/値としてSTDINに送信します。これは、Hadoopストリーミングのデフォルトの動作です。Hadoopコードが変更されていない限り、これを変更するオプションはありません。

public void reduce(Object key, Iterator values, OutputCollector output,
                 Reporter reporter) throws IOException {

    .....
    while (values.hasNext()) {
    .....
        inWriter_.writeKey(key);
        inWriter_.writeValue(val);
    .....      
    }
}
于 2011-10-06T01:33:20.223 に答える
1

Hadoopストリーミングでは、マッパーはキーと値のペアをに書き込みますsys.stdout。Hadoopはシャッフルと並べ替えを行い、結果をのマッパーに転送しsys.stdinます。実際にマップとreduceをどのように処理するかは、そのモデルに従う限り、完全にあなた次第です(stdoutにマップし、stdinからreduceします)。cat data | map | sort | reduceこれが、コマンドラインを介してHadoopとは独立してテストできる理由です。

レデューサーへの入力は、マップされたものと同じキーと値のペアですが、ソートされています。例が示すように、結果を反復処理して合計を累積することも、さらに進んで入力をに渡すこともできます。これにより、使い慣れた入力itertools.groupby()と同等の機能が得られ、組み込みk1, List<values>でうまく機能します。reduce()

重要なのは、reduceを実装するのはあなた次第だということです。

于 2011-10-05T18:14:16.420 に答える
0

ここでのHadoopのストリーミングリファレンスによると:

  • キーは、デフォルトでは、最初のタブの前の行のプレフィックスです。

Map / Reduceフレームワークは、マッパーのstdoutから行を読み取るときに、その行をキーと値のペアに分割します。デフォルトでは、最初のタブ文字までの行のプレフィックスがキーであり、行の残りの部分(タブ文字を除く)が値です。

  • 区切り文字とキーの位置はカスタマイズできます。

ただし、このデフォルトはカスタマイズできます。タブ文字(デフォルト)以外のフィールド区切り文字を指定できます。また、キーと値の間の区切り文字として、行の最初の文字(デフォルト)ではなくn番目(n> = 1)の文字を指定できます。例えば:

  • サンプルコード:

    $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \ -D stream.map.output.field.separator=. \ -D stream.num.map.output.key.fields=4 \ -input myInputDirs \ -output myOutputDir \ -mapper org.apache.hadoop.mapred.lib.IdentityMapper \ -reducer org.apache.hadoop.mapred.lib.IdentityReducer

于 2018-04-14T22:25:58.353 に答える