繁体   English   中英

从集群获取现有的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()方法无法找到它并返回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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM