从集群中获取现有的 mapreduce 作业(该作业可能 运行 或已完成)
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()
方法无法找到它并且 returns 为空。我可以确认作业已从集群 UI 完成。
保持 RunningJob
分开,有没有办法在给定 org.apache.hadoop.mapreduce.JobID
的情况下获取 mapred 作业的 org.apache.hadoop.mapreduce.Job
对象,无论该作业当前是否 运行或已完成?
我尝试编写如下代码:
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对象..但是cluster.getJob()
方法returns为null,所以job本身为null。
我在这里遗漏了什么吗?
您寻找 getAllJobStatuses()
return JobStatus[]
:
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]));
问题是最近的 yarn 升级需要在我的系统上启用 MR 历史服务器。这解决了这个问题。我最近从 MR v1 升级到 v2,在升级中,所有已完成的作业现在都移到了历史服务器。
之前,我使用 org.apache.hadoop.mapred.JobClient#getJob(org.apache.hadoop.mapred.JobID)
来获取 RunningJob
。此调用是从作业完成回调方法进行的,但是,在我看来,存在时间问题,如果作业已经完成,则上述 getJob()
方法无法找到它并且 returns 为空。我可以确认作业已从集群 UI 完成。
保持 RunningJob
分开,有没有办法在给定 org.apache.hadoop.mapreduce.JobID
的情况下获取 mapred 作业的 org.apache.hadoop.mapreduce.Job
对象,无论该作业当前是否 运行或已完成?
我尝试编写如下代码:
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对象..但是cluster.getJob()
方法returns为null,所以job本身为null。
我在这里遗漏了什么吗?
您寻找 getAllJobStatuses()
return JobStatus[]
:
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]));
问题是最近的 yarn 升级需要在我的系统上启用 MR 历史服务器。这解决了这个问题。我最近从 MR v1 升级到 v2,在升级中,所有已完成的作业现在都移到了历史服务器。