0

HDFS に書き込むのではなく、通常のファイル (.csv または .log ファイルなど) に Reducer の結果を書き込みたいと考えています。そこで、レデューサー クラスで次のコードを使用します。

@Override
public void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException {

    // Standard algorithm for finding the max value
    long sum = 0;
    for (LongWritable value : values) {
        sum++; 
    }

    context.write(key, new LongWritable(sum));
    System.out.println(key + " : " + sum);
    Main.map.put(key.toString(), sum);
}

そして、マップのコンテンツを Main クラスの csv ファイルに出力します。ただし、レデューサーが終了した後、ファイルは空です。レデューサークラスではマップに何も配置されず、コンソールのレデューサーに System.out.println(key + ":" + sum) が表示されないため、マップが空であることがわかりました。

それはどうしてですか?それらはレデューサークラスで処理されませんか?

4

1 に答える 1

1

ここで問題の根本に立ち入りましょう。各 map または reduce タスクは、独自の Java 仮想マシン (JVM) で起動されます。これらの JVM は互いにメモリーを共有しません。

次の設定があるとしましょう:

  • jvm-1 : JobClient (これはメインのドライバー クラスです)
  • jvm-2 : Reducer タスク (これは、Reducer が実行されている JVM です)

これが起こることです:

  1. jvm-1は map/reduce ジョブを開始します
  2. jvm-2は項目を入れますMain.map<K,V>
  3. map/reduce ジョブの終了。
  4. jvm-1は読み取りを試みますが、 jvm-2がjvm-1が参照できない独自のメモリ内のマップに書き込んMain.map<K,V>だため、そこには何もありません。

同様のことが起こりSystem.outます。実際にはstdoutストリームにアタッチされていない場合があります。おそらく(マルチノード設定の場合)、出力はネットワーク上の別のマシンに送られます。

于 2013-07-16T22:42:49.150 に答える