Hadoop的JobClient中的submitJob方法抛出空指针

时间:2012-12-07 11:03:21

标签: hadoop mapreduce

我正在尝试执行MapReduce作业,我想定期轮询其状态。我试图在代码中使用Jobclient类的submitJob(jobConf)方法,如下所示

 JobConf conf = new JobConf(SampleJobClass.class)   
 JobClient j= new JobClient();
 j.setConf(conf);
 System.out.println("from conf" +j.getConf().toString());
 RunningJob submitJob=j.submitJob(conf);`

我在第j.submitJob(conf)行继续收到空指针错误 错误堆栈是:

Exception in thread "main" java.lang.NullPointerException
    at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:844)
    at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:818)

关于我出错的任何想法?

2 个答案:

答案 0 :(得分:0)

根据提供的信息,我假设您使用hadoop-2.0.0-mr1-cdh4.0.0 / 4.0.1。
在第844行:

return ugi.doAs(new PrivilegedExceptionAction<RunningJob>() {

NPE可能会发生,因为ugi为null。 ( UserGroupInformation )这是在。中设置的 init()方法但在默认构造函数中不会调用此方法。 因此,请手动调用它:

j.init(conf); 

或简单地使用:

j = new JobClient(conf);

在内部调用 init()

另一方面,我宁愿在命令行中运行Hadoop作业,然后执行一些轮询作业信息的客户端代码,例如:

InetSocketAddress jobtrackerAddr = new InetSocketAddress("myhost",8021);
Configuration conf = new Configuration();
JobClient jobClient = new JobClient(jobtrackerAddr, conf);
JobStatus[] runningJobs = jobClient.jobsToComplete();
...

(有关检索多个群集信息,请参阅我之前的answer

答案 1 :(得分:0)

我也有这个问题。 但使用j.runJob(conf);效果很好。 你也可以使用静态函数JobClient.runJob(conf); 我不知道为什么,但我去阅读JobClienta的源代码并找到静态函数runJob的实现。

public static RunningJob runJob(JobConf job) throws IOException {
JobClient jc = new JobClient(job);
RunningJob rj = jc.submitJob(job);
try {
  if (!jc.monitorAndPrintJob(job, rj)) {
    throw new IOException("Job failed!");
  }
} catch (InterruptedException ie) {
  Thread.currentThread().interrupt();
}
return rj;

} 所以我以这种方式使用submitJob函数:

JobClient jcli = new JobClient(jconf);
        RunningJob rJob = jcli.submitJob(jconf);
        while (true){
            Thread.sleep(5000);
            System.out.println(rJob);
            if (rJob.isComplete())
                break;
        }

我的作品!也许这对你也很有用。