我正在尝试执行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)
关于我出错的任何想法?
答案 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;
}
我的作品!也许这对你也很有用。