Получите org.apache.hadoop.mapreduce.Job от работы, уже выполненной в JobTracker - PullRequest
2 голосов
/ 12 октября 2011

Я использую org.apache.hadoop.mapreduce.Job для создания / отправки / запуска задания MR (Cloudera3, 20.2), и после его завершения в отдельном приложении я пытаюсь заставить задание захватить счетчики для выполнения некоторых работать с ними, поэтому мне не нужно каждый раз заново запускать всю работу MR для проверки работающего кода.

Я могу получить RunningJob от JobClient, но не org.apache.hadoop.mapreduce.Job. RunningJob дает мне счетчики из пакета mapred, в то время как Job дает мне счетчики из пакета mapreduce. Я пытался использовать new Job(conf, "job_id"), но это просто создает пустое задание в статусе DEFINE, а не FINISHED.

1 Ответ

3 голосов
/ 13 октября 2011

Вот как я это делаю:

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

Надеюсь, это поможет.

...