0

マッパーまたはレデューサーを定義しないデフォルトのマップ削減ジョブを分析しようとしていました。つまり、IdentityMapperとIdentityReducerを使用するもの明確にするために、IDレデューサーを書きました

public static class MyIdentityReducer extends MapReduceBase implements Reducer<Text,Text,Text,Text> {
        @Override
        public void reduce(Text key, Iterator<Text> values,
                OutputCollector<Text, Text> output, Reporter reporter)
                throws IOException {
            while(values.hasNext()) {
                Text value = values.next();
                output.collect(key, value);
            }
        }   
    }

私の入力ファイルは次のとおりです。

$ hadoop fs -cat NameAddress.txt
Dravid Banglore
Sachin Mumbai
Dhoni Ranchi
Dravid Jaipur
Dhoni Chennai
Sehwag Delhi
Gambhir Delhi
Gambhir Calcutta

I was expecting
Dravid Jaipur
Dhoni Chennai
Gambhir Calcutta
Sachin Mumbai
Sehwag Delhi

I got
$ hadoop fs -cat NameAddress/part-00000
Dhoni   Ranchi
Dhoni   Chennai
Dravid  Banglore
Dravid  Jaipur
Gambhir Delhi
Gambhir Calcutta
Sachin  Mumbai
Sehwag  Delhi

私は、集計はレデューサーのwhileループでプログラマーによって行われ、その後outputcollectorに書き込まれるという意見でした。outputcollector に渡されるレデューサーのキーは常に一意であるという印象を受けました。ここで集計しないと、最後のキーの値が前の値を上書きするためです。明らかにそうではありません。誰かが出力コレクターのより良いインサイト、それがどのように機能し、どのようにすべてのキーを処理するかを教えてください。Hadoop src コードに outputcollector の多くの実装が見られます。私が期待していることを実行できる独自の outputcollector を作成できますか?

4

1 に答える 1

1

キーはレデューサーに対して一意であり、レデューサーへの各呼び出しには、一意であり、そのキーに関連付けられたすべての値の反復可能なキー値があります。あなたがしていることは、渡されたすべての値を繰り返し処理し、それぞれを書き出すことです。

したがって、あなたのケースではデータよりも呼び出しが少ないかもしれません。それでも、すべての値を書き出すことになります。

于 2012-10-06T20:23:14.017 に答える