1

基本的に、単純な単語カウント (単語とカウントのペアを含むテキスト ファイル、タブ区切り) のマッピング結果である一連のデータがあり、それを減らす必要があります。bz2 ファイルに圧縮された約 160 GB のデータがあります。

Amazon Web Services Elastic Map Reduce (AWS EMR) でジョブを実行するとき、10 個の cc2.8xlarge スレーブと 1 個の m1.xlarge をマスターとして使用します。最終的に 1200 の map タスクと 54 の reduce タスクがあります。map タスクが終了した直後に reduce タスクのちょうど半分が終了し、それらの出力はすべて 0 バイトです。入力が 0 バイトであると想定していますが、確認するのに十分なほどログを掘り下げていません。他の 27 個の reduce タスクは最終的に終了し、ファイル サイズはそれらすべてで一貫しています (それぞれ 2.3 GB)。出力ファイル(part-r-00000、...、part-r-00053)は、偶数ファイルが0バイトのファイルです。

これを 2 つのレデューサーを含む非常に小さなサンプルでローカルに実行すると、各レデューサーの出力にデータが含まれます。

私のマッパーとリデューサーは次のとおりです(Java w / extrasが取り除かれています):

// ...

public void map(LongWritable key, Text val, Context context) throws IOException, InterruptedException {
  String[] parts = val.toString().split("\t");
  if (parts.length > 1) {
    keyOut.set(parts[0]);
    valOut.set(Integer.parseInt(parts[1]));
    context.write(keyOut, valOut);
  }
}

// ...

public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
  int sum = 0;
  for (IntWritable val : values) {
    sum += val.get();
  }
  result.set(sum);
  context.write(key, result);
}

// ...

他の誰かがこれを経験しましたか?なぜこれが起こったのか、またはこれをさらにデバッグする方法はありますか? ログで何かを探す必要がある場合に備えて、EMR デバッグをオンにしました。ありがとう

編集: S3でデータを読み込んで保存していることに注意してください

編集 2:この同じジョブを以前に 1 回実行したところ、0 バイトのファイルが表示され、Reducer にバグがあると想定したため、ジョブをキャンセルしました。したがって、これが 1 回限りのイベントではないことはわかっています。ジョブは同じクラスターで実行されました。私は当初、「Hadoop 2.0」を含む Cloudera 4 (CDH4) ライブラリで Java クラスをコンパイルしたため、これが問題である可能性があると考えました。2回目に実行したときは、基本的にAWSと同じバージョンのHadoop 0.20を備えたCloudera 3(CDH3)ライブラリでコンパイルされたJavaクラスを使用しました。また、この動作なしで過去にコンパイルするために CDH3 を使用しました。

4

0 に答える 0