我正在使用org.apache.hadoop.mapreduce.Job
创建/提交/运行MR作业(Cloudera3,20.2),在完成之后,在一个单独的应用程序中,我试图让Job抓住计数器到做一些与他们合作,所以我不必每次都重新运行整个MR作业来测试我的代码是否有效。
我可以从JobClient获得RunningJob
,但不能获得org.apache.hadoop.mapreduce.Job
。 RunningJob给我mapred包中的计数器,而Job给我mapreduce包中的计数器。我尝试使用new Job(conf, "job_id")
,但只创建状态为DEFINE
的空白作业,而不是FINISHED
。
答案 0 :(得分:3)
以下是我的工作方式:
package org.apache.hadoop.mapred;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
public class FinishedJobHelper {
public static Counters getCounters(String jobTrackerHost, int jobTrackerPort, String jobIdentifier, int jobId) throws IOException {
InetSocketAddress link = new InetSocketAddress(jobTrackerHost, jobTrackerPort);
JobSubmissionProtocol client = (JobSubmissionProtocol) RPC.getProxy(JobSubmissionProtocol.class, JobSubmissionProtocol.versionID, link, new Configuration());
return client.getJobCounters(new JobID(jobIdentifier, jobId));
}
}
包应该是org.apache.hadoop.mapred
(不要更改),因为JobSubmissionProtocol
是受保护的接口。此方法的问题是您无法检索“已退役”的作业。因此,我不希望继续这样做,并在作业完成后立即推送计数器。
...
job.waitForCompletion(true);
//get counters after job completes and push them elsewhere
Counters counters = job.getCounters();
...
希望这会有所帮助。