Java MapReduce程序映射任务超时

Java MapReduce程序映射任务超时,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我犯了一个奇怪的错误。我编写了一个wordCount程序来计算一个单词在文件中重复的次数 因此,当我在hadoop上运行MR代码时,代码会卡在“映射100%,减少0%”上。 基本模式是第一个映射任务在600秒后超时,然后再次超时,作业将自行终止 我检查了作业跟踪器,任务被卡住了,因为映射任务没有完成,reduce任务无法启动 我已经试着修复了2天,在这期间我删除了原来的虚拟Ubuntu Cloudera并重新安装了它-所以我们可以确定这不是一个配置问题 感谢您的帮助 下面是3个代码文件 Word

我犯了一个奇怪的错误。我编写了一个wordCount程序来计算一个单词在文件中重复的次数

因此,当我在hadoop上运行MR代码时,代码会卡在“映射100%,减少0%”上。 基本模式是第一个映射任务在600秒后超时,然后再次超时,作业将自行终止

我检查了作业跟踪器,任务被卡住了,因为映射任务没有完成,reduce任务无法启动

我已经试着修复了2天,在这期间我删除了原来的虚拟Ubuntu Cloudera并重新安装了它-所以我们可以确定这不是一个配置问题

感谢您的帮助

下面是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);
    }
}
}
公共类WordCount扩展配置的实现工具{
@凌驾
公共int运行(字符串[]args)引发异常{
配置conf=super.getConf();
Job Job=新作业(conf,“单词计数作业”);
job.setJarByClass(WordCount.class);
setMapperClass(WordMapper.class);
job.setReducerClass(WordReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(FloatWritable.class);
setInputFormatClass(TextInputFormat.class);
setOutputFormatClass(TextOutputFormat.class);
setInputPaths(作业,新路径(args[0]);
setOutputPath(作业,新路径(args[1]);
job.waitForCompletion(Boolean.TRUE);
返回0;
}
公共静态void main(字符串[]args){
//如果提供的参数不足,则显示错误消息

如果(args.length您的问题在这行代码中:

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

valsIter.hasNext检查迭代器中是否有下一个元素,但不移动指针的位置。因此,检查始终返回true。除非调用valsIter.next().

我刚刚尝试了这个方法,结果成功了,但我希望有人能解释一下。我将WordMapper.java中的“while”循环更改为增强的for循环,结果成功了。这突出了单元测试的重要性!!陌生人,你浪费了自己的时间,并将这个问题误解为Hadoop问题,仅仅是因为你太草率,无法花10分钟来编写单元测试tsk@RaviChandraTimmavajjula您应该将此标记为已回答。
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));
}
}
    while(valsIter.hasNext()) 
    i++;