Hadoop ストリーミングで作業する場合は、最初にこのチュートリアルを実行して、シェル コマンドの使用方法を学習すると役立つ場合があります。それはあなたをかなり助けてくれるでしょう。
基本的に、Reducer の動作方法により、出力は異なります。現在のキーが最後のキーと同じである間、すべての値を合計します。現在のキーが以前のキーと異なる場合、以前のキーの値を書き出して、現在のキーの処理を開始します。入力が のようfoo foo bar foo
になると、Mapper はこれらの値を順番に処理し、次のような出力を生成します。
foo 1
foo 1
bar 1
foo 1
これは、同じ形式で Reducer に送信されます。Reducer はそれを 1 行ずつ読み取ります。これをよりよく理解するために、Reducer が実行する手順を次に示します。
// current_key = NULL
input_key,input_value: foo,1
input_key != current_key:
current_key = input_key
current_value = input_value
// current_value = 1
// current_key = foo
input_key,input_value: foo,1
input_key == current_key:
current_value += input_value
// current_value = 2
// current_key = foo
input_key,input_value: bar,1
input_key != current_key:
emit <current_key, current_value>
current_key = input_key
current_value = input_value
// current_value = 1
// current_key = bar
input_key,input_value: foo,1
input_key != current_key:
emit <current_key, current_value>
current_key = input_key
current_value = input_value
// current_value = 1
これにより、foo 2、bar 1、foo 1 の出力が得られます。ここで、入力を Reducer に並べ替えると、次のようになります。
foo 1
foo 1
foo 1
bar 1
これにより、Reducer はキーfoo
によって中断されることなく一緒に値を追加し続けることができるため、foo 3, bar 1 の出力が得られます。値のソートは、に基づいてソートする UNIX コマンドであるbar
によって実行できますsort -k1,1
最初のフィールド。Hadoop MapReduce フレームワークは、中間値 (つまり、foo 1、foo 1、bar 1、foo 1 データ) を自動的にソートします。これにより、同じキーを持つすべてのキーと値のペアが同じ Reducer にまとめられ、あたかも同じ出力が生成されます。を介して中間値を渡しましたsort -k1,1
。