[英]Getting existing mapreduce job from cluster (the job could be running or completed)
以前,我使用org.apache.hadoop.mapred.JobClient#getJob(org.apache.hadoop.mapred.JobID)
获取RunningJob
。 该调用是从作业完成回调方法进行的,但是在我看来,这是一个计时问题,如果该作业已经完成,则上述getJob()
方法无法找到它并返回null。 我可以从群集UI确认作业已完成。
保持RunningJob
之余,有没有办法让org.apache.hadoop.mapreduce.Job
给出的一个mapred工作的对象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,因此作业本身为null。
有什么我想念的吗?
问题在于最近的纱线升级,需要在我的系统上启用MR历史记录服务器。 这解决了问题。 我最近从MR v1升级到v2,在该升级中,所有已完成的作业现在都移到了历史记录服务器上。
您正在寻找返回getAllJobStatuses()
JobStatus[]
getAllJobStatuses()
:
List<JobStatus> runningJobs = new ArrayList<JobStatus>();
List<JobStatus> completedJobs = new ArrayList<JobStatus>();
for (JobStatus job : cluster.getAllJobStatuses()) {
if (!job.isJobComplete()) {
runningJobs.add(job);
}
else {
completedJobs.add(job)
}
}
// list of running JobIDs
for (JobStatus rjob : runningJobs) {
System.out.println(rjob.getJobID().toString());
}
// list of completed JobIDs
for (JobStatus cjob : completedJobs) {
System.out.println(cjob.getJobID().toString());
}
// to print out short report on running jobs:
// displayJobList(runningJobs.toArray(new JobStatus[0]));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.