以前,我使用 org.apache.hadoop.mapred.JobClient#getJob(org.apache.hadoop.mapred.JobID)
来获取 RunningJob
。此调用是从作业完成回调方法进行的,但是,在我看来,存在时间问题,如果作业已经完成,则上述 getJob()
方法找不到它并返回 null。我可以从集群 UI 确认作业已完成。
保持 RunningJob
分开,有没有办法在给定 org. apache.hadoop.mapreduce.JobID
,无论作业当前是正在运行还是已完成?
我试着编写类似这样的代码:
集群 cluster = jobClient.getClusterHandle();
作业 job = cluster.getJob(JobID.forName(jobId));
log.info("尝试获取 ID 为 {} 的实际作业,在集群 {} 上找到了 {}",JobID.forName(jobId),job,cluster);
我可以看到正确的 jobId,也可以看到集群对象。但是 cluster.getJob()
方法返回 null,所以作业本身是 null。
我在这里遗漏了什么吗?
最佳答案
问题是最近的 yarn 升级需要在我的系统上启用 MR 历史服务器。这解决了这个问题。我最近从 MR v1 升级到 v2,在升级中,所有已完成的作业现在都移到了历史服务器。
关于java - 从集群中获取现有的 mapreduce 作业(作业可能正在运行或已完成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43922791/