我正在尝试执行 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)
关于我弄错了什么有什么想法吗?
最佳答案
根据提供的信息,我假设您使用的是 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)
关于hadoop - Hadoop的JobClient中的submitJob方法抛出空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13761800/