1

私は0Reducesでhadoopを使用しています。目標は、メソッドでオブジェクトを段階的に作成することmapです。次に、ある時点でそれを出力フォルダーに書き込み(シリアル化)します。私が言ったように、このreduce作品はここでは何もしません。どうすればよいですか?これは私が持っているものです:

configureメソッドで、ファイルへのパスを取得します。

@Override
public void configure(JobConf conf) {      
  taskSideEffectFile = FileOutputFormat.getWorkOutputPath(conf) + "/temp";    
}

mapメソッドでは、オブジェクトを作成していて、最終的にはシリアル化したいと思っています。今のところ、常にmapメソッドでオブジェクトを書き込もうとしています。

@Override
public void map(LongWritable key, Text value,
    OutputCollector<Text, IntWritable> output, Reporter reporter)
    throws IOException {        

  AddInstanceToClassifier(value.toString());

  try
  {             
    //serialize classifier
    weka.core.SerializationHelper.write( taskSideEffectFile, nb);

  }
  catch (Exception ex)
  {
    System.err.println("Failed to serialize classifier: " + ex.getMessage());
    throw new IOException("taskSideEffectFile: " + ex.getMessage());

  } 

}

これは私が得ているエラーです:

12/05/09 22:47:00 INFO mapred.JobClient:  map 0% reduce 0%
12/05/09 22:47:08 INFO mapred.JobClient: Task Id : attempt_201205091117_0015_m_000001_0, Status : FAILED
java.io.IOException: taskSideEffectFile: hdfs:/192.168.78.129:9000/user/hadoop-user/output/_temporary/_attempt_201205091117_0015_m_000001_0/temp (No such file or directory)
    at naive.bayes.hadoop.MusicClassifierMapper.SaveClassifier(MusicClassifierMapper.java:168)
    at naive.bayes.hadoop.MusicClassifierMapper.map(MusicClassifierMapper.java:121)
    at naive.bayes.hadoop.MusicClassifierMapper.map(MusicClassifierMapper.java:1)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:47)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:227)
    at org.apache.hadoop.mapred.TaskTracker$Child.main(TaskTracker.java:2209)

:私はyahooのhadoop-0.18.0を使用しています(これは、Eclipseからアプリを実行する唯一の方法だと思いました)

4

1 に答える 1

1

Hadoop は、一時ファイルを保存し、タスクが成功したときにそれらを出力フォルダーに「昇格」することになっています。

修正方法は次のとおりです

  • もう一時パスは使用しないでください。
  • 作成した HDFS のフォルダーに配置するコードを記述します。
于 2012-05-10T04:19:28.390 に答える