Редактировать: Похоже, это не очень хорошая практика для извлечения счетчиков на карте и сокращения задач с помощью 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 также включает задачи карты, запущенные из-за умозрительного выполнения также