Получение существующей работы по перенастройке из кластера (работа может выполняться или завершаться)

Раньше я использовал org.apache.hadoop.mapred.JobClient#getJob(org.apache.hadoop.mapred.JobID) для получения RunningJob. Этот вызов был сделан из метода обратного вызова завершения задания, однако мне кажется, что существует проблема синхронизации, когда, если задание уже завершено, выше описанный метод getJob() не может найти его и возвращает значение null. Я могу подтвердить, что задание было выполнено из пользовательского интерфейса кластера.

Сохраняя 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);

Я могу видеть правильную работу и видеть объект кластера.. но метод cluster.getJob() возвращает значение null, поэтому само задание равно null.

Есть ли что-то, что мне не хватает здесь?

Ответ 1

Проблема заключалась в недавнем обновлении нити, которое требовало включения сервера истории MR в мою систему. Это устранило проблему. Недавно я обновился с MR v1 до v2 и в этом обновлении все завершенные задания теперь перемещаются на сервер истории.

Ответ 2

Вы ищете getAllJobStatuses(), которые возвращают 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]));