【问题标题】:Hadoop mapreduce-java.io.IOException: Job failedHadoop mapreduce-java.io.IOException:作业失败
【发布时间】:2015-10-12 12:54:26
【问题描述】:

我在尝试执行hadoop mapreduce 程序时收到以下exception

java.io.IOException:作业失败! 在 org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:865) 在 com.vasa.books.BookDriver.main(BookDriver.java:37)

BookDriver.java

package com.vasa.books;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
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.TextInputFormat;
import org.apache.hadoop.mapred.TextOutputFormat;

public class BookDriver {

    public static void main(String args[]) {
        // TODO Auto-generated method stub
        JobClient client=new JobClient();
        JobConf conf=new JobConf(com.vasa.books.BookDriver.class);

        conf.setJobName("booknamefind");


        conf.setOutputKeyClass(Text.class);
        conf.setOutputValueClass(IntWritable.class);

        conf.setMapperClass(com.vasa.books.bookmapper.class);
        conf.setReducerClass(com.vasa.books.bookreducer.class);

        conf.setInputFormat(TextInputFormat.class);
        conf.setOutputFormat(TextOutputFormat.class);

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

        client.setConf(conf);
        try{
        JobClient.runJob(conf);
        }catch(Exception e){
        e.printStackTrace();
        }

    }
}

BookMapper.java

package com.vasa.books;

import java.io.IOException;  

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapred.MapReduceBase;
import org.apache.hadoop.mapred.Mapper;
import org.apache.hadoop.mapred.OutputCollector;
import org.apache.hadoop.mapred.Reporter;

public class BookMapper extends MapReduceBase implements Mapper<LongWritable,Text,Text,IntWritable> {
    private final static IntWritable one=new IntWritable(1);
    public void map(LongWritable _key, Text value,
            OutputCollector<Text, IntWritable> output, Reporter reporter)
            throws IOException {
        // TODO Auto-generated method stub
        String Tempstring=value.toString();
        String[] singlebookdata=Tempstring.split("\",\"");
        output.collect(new Text(singlebookdata[3]), one);


    }

}

为什么会出现这种异常?

【问题讨论】:

  • 你能展示你给定的论点吗?
  • @patrick 在运行配置中,我给出了以下参数作为输入和输出 BX-Books.txt out_file
  • 检查该文件的路径是否正确。在您的论点中,路径应该正是文件存储的位置。

标签: java hadoop


【解决方案1】:

根据 JobClient 源,JobClient.runJob() 调用 JobClient.monitorAndPrintJob() 返回一个布尔值。如果该布尔值是假的(意味着作业失败),它会打印出无用的错误消息“某事失败!”你所看到的。

要解决这个问题,您有两种选择:

1 - (更快)检查日志。 RunningJob 故障信息应该会打印到日志中。

2 - 如果您不知道日志在哪里,没有启用日志记录,或者不想挖掘日志,您可以重写一些代码。我不会使用JobClient.runJob(),而是使用与runJob() 在您的代码中所做的相同的操作,这样当它失败时您会收到有用的错误消息。

  public static RunningJob myCustomRunJob(JobConf job) throws Exception {
    JobClient jc = new JobClient(job);
    RunningJob rj = jc.submitJob(job);
    if (!jc.monitorAndPrintJob(job, rj)) {
      throw new IOException("Job failed with info: " + rj.getFailureInfo());
    }
    return rj;
  }

我的猜测是根本问题是没有找到 arg[0] 或 arg[1](您的输入或输出文件)。

【讨论】:

  • 感谢您的建议@aguibert,最后我发现异常是由于我在 BookMapper.java 中拆分文本文件的方式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多