从集群中获取现有的 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,在升级中,所有已完成的作业现在都移到了历史服务器。