从已在JobTracker上完成的作业中获取org.apache.hadoop.mapreduce.Job

时间:2011-10-12 16:37:12

标签: hadoop mapreduce

我正在使用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

1 个答案:

答案 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();
...

希望这会有所帮助。