2013-09-28 161 views
0

我在一個流行的hadoop教科書中提供了一個簡單的例子。代碼如下: - [程序後,我的問題的說明如下]減速機停止工作

package src.main.myjob; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.Iterator; 
import java.util.Set; 

import javax.lang.model.SourceVersion; 

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.conf.Configured; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapred.FileInputFormat; 
import org.apache.hadoop.mapred.FileOutputFormat; 
import org.apache.hadoop.mapred.JobClient; 
import org.apache.hadoop.mapred.JobConf; 
import org.apache.hadoop.mapred.KeyValueTextInputFormat; 
import org.apache.hadoop.mapred.MapReduceBase; 
import org.apache.hadoop.mapred.Mapper; 
import org.apache.hadoop.mapred.OutputCollector; 
import org.apache.hadoop.mapred.Reducer; 
import org.apache.hadoop.mapred.Reporter; 
import org.apache.hadoop.mapred.TextOutputFormat; 
import org.apache.hadoop.util.Tool; 
import org.apache.hadoop.util.ToolRunner; 

/** 
* @author Anup Saumithri 
*/ 

public class MyJob extends Configured implements Tool 
{ 
    public static class MapClass extends MapReduceBase implements Mapper<Text, Text, Text, Text> 
    { 

     @Override 
     public void map(Text key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throws IOException 
     { 
     output.collect(value, key); 
     } 
    } 

    public static class Reduce extends MapReduceBase implements Reducer<Text, Text, Text, Text> 
    { 
      public void reduce(Text key, Iterator<Text> values, OutputCollector<Text, Text> output, Reporter reporter) throws IOException 
      { 
       String csv = ""; 
       while(values.hasNext()) 
       { 
     csv += values.next().toString(); 
         csv += ","; 
       } 
       output.collect(key, new Text(csv)); 
      } 
    } 


    @Override 
    public int run(String[] args) throws Exception 
    { 
     Configuration conf = new Configuration(); 
     JobConf job = new JobConf(conf, MyJob.class); 

     Path in = new Path(args[0]); 
     Path out = new Path(args[1]); 

     FileInputFormat.setInputPaths(job, in); 
     FileOutputFormat.setOutputPath(job, out); 

     job.setJobName("MyJob"); 
     job.setMapperClass(MapClass.class); 
     job.setReducerClass(Reduce.class); 

     job.setInputFormat(KeyValueTextInputFormat.class); 
     job.setOutputFormat(TextOutputFormat.class); 

     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(Text.class); 

     job.set("key.value.seperator.in.input.line", ","); 

     JobClient.runJob(job); 

     return 0; 
    } 

    public static void main(String[] args) throws Exception 
    { 
     int res = ToolRunner.run(new Configuration(), new MyJob(), args); 

     System.exit(res); 
    } 


} 

現在讀者的利益這一切的程序做它處理包含引用專利的id行的文件[大文件] &引用了專利ID並將其反轉。所以實質上,輸出文件具有所列出的所有專利ID,每個專利ID後面跟着逗號分隔的引用專利ID列表。

當我嘗試執行Map任務運行得很好,但是reduce任務卡在66%。我嘗試過諸如檢查日誌等很多東西(很隱晦的&幾乎沒有用),並增加了reducer的數量。但是,我很少成功地理解這個問題。代碼看起來很直截了當。我真的很感謝你的投入,幫助我理解如何在這裏調試這個問題。我沒有看到這個程序有什麼明顯的錯誤。

回答

0

首先,請考慮在減速用StringBuilder追加如果你試圖連接字符串。如果數據量很大,那麼這個循環會更好地執行。

StringBuilder sb = new StringBuilder(); 
sb.append(values.next().toString()); 

然後確保你在減速器中有足夠的內存,如果你有一個非常龐大的一組數據需要處理。

+0

感謝您的迴應,我希望我可以測試出來,但數據節點沒有啓動。我想知道爲什麼Hadoop在行爲上如此不一致。開發MapReduce應用程序似乎比管理Hadoop/HDFS要容易得多=> Harderst部分是調試/管理而不是開發.... – Ace

+0

我認爲你沒有足夠的磁盤空間。你檢查過了嗎? –

+0

我每次提交作業都會做namenode格式。 – Ace

0

作爲附錄這個問題,我也終於完成了我的MapReduce程序成功。我不得不增加hadoop的內存分配,使其在mapred-site.xml內部達到6GB。&也使用字符串生成器,正如JthRocker在上面的帖子中所建議的那樣。它完成了,但輸出文件不可讀。 Ubuntu表示它的大小是258MB,比我的輸入文件略小。我想知道它是我的代碼本身的缺陷嗎?或者如果數據沒有以編輯友好的格式正確寫入,從而導致解釋問題?所有的投入都非常感謝。