Есть ли способ получить доступ к числу успешных задач карты из задачи сокращения в задании MR? - PullRequest
1 голос
/ 04 ноября 2011

В моих Hadoop редукторах мне нужно знать, сколько успешных задач карты было выполнено в текущем задании.Я придумал следующее, что, насколько я могу судить, НЕ работает.

    Counter totalMapsCounter = 
        context.getCounter(JobInProgress.Counter.TOTAL_LAUNCHED_MAPS);
    Counter failedMapsCounter = 
        context.getCounter(JobInProgress.Counter.NUM_FAILED_MAPS);
    long nSuccessfulMaps = totalMapsCounter.getValue() - 
                           failedMapsCounter.getValue();

В качестве альтернативы, если есть хороший способ, которым я мог бы получить (опять же, из моих редукторов) общее количество входных разбиений (не количество файлов и не разделений для одного файла, а общее количество разделений для задания), которое, вероятно, также будет работать.(Предполагая, что моя работа завершается нормально, это должно быть то же число, верно?)

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

Редактировать: Похоже, это не очень хорошая практика для извлечения счетчиков на карте и сокращения задач с помощью Job или JobConf. Вот альтернативный подход для передачи сводных данных от преобразователя в редуктор. Этот подход требует определенных усилий для написания кода, но выполним. Было бы неплохо, если бы эта функция была частью Hadoop и не требовала написания кода вручную. Я попросил включить эту функцию в Hadoop и жду ответа.


JobCounter.TOTAL_LAUNCHED_MAPS был получен с использованием приведенного ниже кода в классе Reducer со старым API MR.

private String jobID;
private long launchedMaps;

public void configure(JobConf jobConf) {

    try {
        jobID = jobConf.get("mapred.job.id");

        JobClient jobClient = new JobClient(jobConf);

        RunningJob job = jobClient.getJob(JobID.forName(jobID));

        if (job == null) {
            System.out.println("No job with ID found " + jobID);
        } else {
            Counters counters = job.getCounters();
            launchedMaps = counters.getCounter(JobCounter.TOTAL_LAUNCHED_MAPS);
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

С новым API реализации Reducer могут получить доступ к Конфигурации для задания через JobContext # getConfiguration () . Приведенный выше код может быть реализован в Reducer # setup () .

Reducer # configure () в старом MR API и Reducer # setup () в новом MR API, вызываются один раз для каждой задачи уменьшения до вызова Reducer.reduce () .

Кстати, счетчики можно получить от другой JVM, кроме той, которая начала работу.

JobInProgress определен, как показано ниже, поэтому его не следует использовать. Этот API предназначен только для ограниченных проектов, и интерфейс может измениться.

@InterfaceAudience.LimitedPrivate ({ "MapReduce"})
@InterfaceStability.Unstable

Не так, JobCounter.TOTAL_LAUNCHED_MAPS также включает задачи карты, запущенные из-за умозрительного выполнения также

1 голос
/ 11 февраля 2015

Используя новый API, я получил один пользовательский счетчик (Enum in Mapper) и встроенный счетчик.Это код моего редуктора: это метод настройки редуктора.Хотя там я должен использовать некоторые классы старого API (пакет mapred)

    JobContext jobContext= new JobContext(context.getConfiguration(), context.getJobID());
    Configuration c= jobContext.getConfiguration();

    jobID=c.get("mapred.job.id");
    //jobId= JobID.forName(jobID);

    JobClient jobClient = new JobClient(new JobConf(c));

    RunningJob job = jobClient.getJob((org.apache.hadoop.mapred.JobID) JobID.forName(jobID));

    Counters counters = job.getCounters();

    long customCounterCount= counters.getCounter(WordCountMapper.CustomCounters.COUNT);

    long totalMapInputRecords = counters.getCounter(Task.Counter.MAP_INPUT_RECORDS);

    System.out.println("customCounterCount==> " + customCounterCount);
    System.out.println("totalMapInputRecords==> " + totalMapInputRecords);
...