以前,我使用org.apache.hadoop.mapred.JobClient#getJob(org.apache.hadoop.mapred.JobID)
来获取RunningJob
。此调用是从作业完成回调方法进行的,但是,在我看来,存在一个计时问题,如果作业已经完成,那么上面的getJob()
方法找不到它并返回null。我可以确认该作业是从集群UI完成的。
保持RunningJob
分开,有没有办法在给定org.apache.hadoop.mapreduce.Job
的情况下获取已映射作业的org.apache.hadoop.mapreduce.JobID
对象,无论作业当前是在运行还是已完成?
我尝试编写类似的代码:
Cluster cluster = jobClient.getClusterHandle();
Job job = cluster.getJob(JobID.forName(jobId));
log.info("Trying to get actual job with id {} , found {} on cluster {}", JobID.forName(jobId), job, cluster);
我可以看到正确的jobId,也可以看到集群对象..但cluster.getJob()
方法返回null,因此作业本身为空。
我有什么东西可以在这里错过吗?
答案 0 :(得分:5)
问题在于最近的纱线升级需要在我的系统上启用MR历史记录服务器。这解决了这个问题。我最近从MR v1升级到v2,在该升级中,所有已完成的作业现在都已移至历史服务器。
答案 1 :(得分:0)
您正在寻找返回getAllJobStatuses()
的<{1}}:
JobStatus[]