2014-09-13 8 views
0

이 이상한 오류가 발생합니다. 나는 단어가 파일에서 반복되는 횟수를 세는 wordCount 프로그램을 작성했다.MapReduce 프로그램 맵 작업 시간 초과

그래서 내가 hadoop에서 MR 코드를 실행하면 코드가 "Map 100 %, Reduce 0 %"에서 멈추게됩니다. 기본 패턴은 600 초 후에 첫 번째 맵 작업 시간이 초과 된 다음 다시 한 번 작업이 종료됩니다.

작업 추적기를 확인했는데지도 작업이 축소 작업을 시작할 수 없기 때문에 작업이 중단되었습니다.

원래 가상 우분투 클라우 데라를 삭제하고 다시 설치 한 이틀 동안 문제를 해결하려고 노력해 왔습니다. 구성 문제가 아닌지 확인할 수 있습니다.

도움을 주시면 감사하겠습니다.

다음은 3 가지 코드 파일입니다.

WordCount.java

public class WordCount extends Configured implements Tool { 

@Override 
public int run(String[] args) throws Exception { 

    Configuration conf = super.getConf(); 

    Job job=new Job(conf, "Word Count Job"); 
    job.setJarByClass(WordCount.class); 

    job.setMapperClass(WordMapper.class); 
    job.setReducerClass(WordReducer.class); 

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

    job.setInputFormatClass(TextInputFormat.class); 
    job.setOutputFormatClass(TextOutputFormat.class); 

    FileInputFormat.setInputPaths(job, new Path(args[0])); 
    FileOutputFormat.setOutputPath(job, new Path(args[1])); 

    job.waitForCompletion(Boolean.TRUE); 

    return 0; 
} 

public static void main(String[] args) { 

    //Display error message in case insufficient arguments supplied 
    if(args.length<2){ 
     System.out.println("usage: WordCount <Input-Path> <Output-Path>"); 
    } 

    Configuration conf=new Configuration(Boolean.TRUE); 

    int i; 
    try { 
     //Run the overridden 'run' method code 
     i = ToolRunner.run(conf, new WordCount(), args); 

     //Print usage stats to out 
     //ToolRunner.printGenericCommandUsage(System.out); 

     //exit if job cannot start 
     System.exit(i); 

    } catch (Exception e) { 

     e.printStackTrace(); 

     System.exit(-1); 
    } 
} 
} 

WordMapper.java

public class WordMapper extends Mapper<LongWritable, Text, Text, FloatWritable> { 

@Override 
protected void map(LongWritable key, 
     Text value, 
     Mapper<LongWritable, Text, Text, FloatWritable>.Context context) 
     throws IOException, InterruptedException { 


    if(!value.toString().trim().isEmpty()){ 

     StringTokenizer valTokens = new StringTokenizer(value.toString()); 

     while(valTokens.hasMoreTokens()){ 
      context.write(new Text(valTokens.nextToken()), new FloatWritable(Float.parseFloat("1.00"))); 
     } 
    } 
} 
} 

WordReducer.java

public class WordReducer extends Reducer<Text, FloatWritable, Text, FloatWritable> { 

@Override 
protected void reduce(Text key, Iterable<FloatWritable> values, 
     Reducer<Text, FloatWritable, Text, FloatWritable>.Context context) 
     throws IOException, InterruptedException { 

    Iterator<FloatWritable> valsIter = values.iterator(); 
    int i = 0; 

    while(valsIter.hasNext()) 
     i++; 

    context.write(key, new FloatWritable((float)i)); 
} 
} 
+0

방금 ​​시도했지만 효과가 있었지만 누군가가 설명 할 수 있기를 바랍니다. _wordMapper.java_의 'while'루프를 _enhanced for loop_으로 변경하여 작동했습니다. – theRealDarthVader

+0

이것은 단위 테스트의 중요성을 강조합니다 !! 당신은 자신의 시간과 낯선 사람을 낭비했고, 문제를 하둡 (Hadoop) 문제로 오해 했었습니다. 단위 테스트를 쓰기에는 10 분이 걸리기가 너무 쉽지 않았기 때문입니다. Tsksksk – samthebest

답변

2

귀하의 문제가이 코드 줄에 있습니다

while(valsIter.hasNext()) 
    i++; 

valsIter.hasNext는 이터레이터에 다음 요소가 있는지 확인하지만 포인터의 위치는 이동하지 않습니다. 따라서 수표는 항상 true를 반환합니다. valsIter.next()를 호출하지 않는 한.

+0

그래, 감사합니다 @Venkat – theRealDarthVader

+0

@RaviChandraTimmavajjula 당신은 이것을 Answered로 표시해야합니다. – Venkat