Получение существующей работы по перенастройке из кластера (работа может выполняться или завершаться)
Раньше я использовал 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]));