이 이상한 오류가 발생합니다. 나는 단어가 파일에서 반복되는 횟수를 세는 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));
}
}
방금 시도했지만 효과가 있었지만 누군가가 설명 할 수 있기를 바랍니다. _wordMapper.java_의 'while'루프를 _enhanced for loop_으로 변경하여 작동했습니다. – theRealDarthVader
이것은 단위 테스트의 중요성을 강조합니다 !! 당신은 자신의 시간과 낯선 사람을 낭비했고, 문제를 하둡 (Hadoop) 문제로 오해 했었습니다. 단위 테스트를 쓰기에는 10 분이 걸리기가 너무 쉽지 않았기 때문입니다. Tsksksk – samthebest