2012-05-10 68 views
1

我正在使用hadoop 0減少。目標是在map方法中增量創建一個對象。然後在某個時候寫入(序列化)到輸出文件夾。就像我說的那樣reduce這一塊在這裏什麼都不會做。我該怎麼做呢?這是我有:hadoop任務副作用文件

在配置方法,我得到的文件路徑:

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

在地圖方法我建立我的對象,最終我想序列化,現在我想它總是寫在地圖上方法:

@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) 

注意:我使用的是雅虎的Hadoop-0.18.0開始(我認爲這是我對從Eclipse運行的應用程序唯一方法)

回答

1

Hadoop是應該存儲您的臨時文件,然後「推廣」他們的輸出文件夾,當任務成功時。

這裏是你如何解決它

  • 不要再使用臨時路徑。
  • 因此,現在編寫代碼將其放在您創建的HDFS文件夾中