На данный момент у меня есть задание Hadoop, которое создает счетчики с довольно громким именем.
Так , например, следующий: stats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-within-standard-limits
. Этот счетчик усекается в веб-интерфейсе и при getName()
вызове метода. Я обнаружил, что Hadoop имеет ограничения на максимальное имя счетчика, и этот идентификатор настроек mapreduce.job.counters.counter.name.max
предназначен для настройки этого ограничения. Я увеличил это значение до, 500
и теперь в веб-интерфейсе отображается полное имя счетчика. Но getName()
счетчик по-прежнему возвращает усеченное имя.
Может ли кто-нибудь объяснить это или указать на мои ошибки? Спасибо.
ИЗМЕНИТЬ 1
Моя конфигурация сервера Hadoop состоит из одного сервера с HDFS, YARN и самого map-reduce на нем. Во время map-reduce есть несколько приращений счетчика, а после завершения задания ToolRunner
я получаю счетчики с использованием org.apache.hadoop.mapreduce.Job#getCounters
.
ИЗМЕНИТЬ 2
Версия Hadoop следующая:
Hadoop 2.6.0-cdh5.8.0
Subversion http://github.com/cloudera/hadoop -r 042da8b868a212c843bcbf3594519dd26e816e79
Compiled by jenkins on 2016-07-12T22:55Z
Compiled with protoc 2.5.0
From source with checksum 2b6c319ecc19f118d6e1c823175717b5
This command was run using /usr/lib/hadoop/hadoop-common-2.6.0-cdh5.8.0.jar
Я провел дополнительное расследование, и похоже, что эта проблема описывает ситуацию, похожую на мою. Но это довольно сбивает с толку, потому что я могу увеличить количество счетчиков, но не длину имени счетчика ...
РЕДАКТИРОВАТЬ 3
Сегодня я потратил много времени на внутреннюю отладку Hadoop. Несколько интересных вещей:
org.apache.hadoop.mapred.ClientServiceDelegate#getJobCounters
метод возвращает набор счетчиков из пряжи с ОБРЕЗАННЫМИ именами и ПОЛНЫМИ отображаемыми именами.- Не удалось отладить сами карты и редукторы, но с помощью регистрации кажется, что
org.apache.hadoop.mapreduce.Counter#getName
метод работает правильно во время выполнения редуктора.
getName()
вызове, который по-прежнему возвращает усеченное имя? Это итерация по счетчикам, возвращаемым изJob#getCounters()
отправляющего клиента после ожидания завершения задания, или это отдельное приложение, запрашивающее счетчики с сервера истории заданий, или это что-то совсем другое? Я ожидаю, что вашей конфигурации будет достаточно. Веб-интерфейс использует тот жеgetName()
вызов. (Тем не менее, он не будет задним числом исправлять усеченные имена счетчиков из заданий, отправленных до изменения конфигурации.)stats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-within-standard-limits
Ответы:
В коде Hadoop нет ничего, что сокращало бы имена счетчиков после его инициализации. Итак, как вы уже отметили,
mapreduce.job.counters.counter.name.max
контролирует максимальную длину имени счетчика (с 64 символами в качестве значения по умолчанию ).Этот лимит применяется во время звонков на
AbstractCounterGroup.addCounter/findCounter
. Соответствующий исходный код следующий :@Override public synchronized T addCounter(String counterName, String displayName, long value) { String saveName = Limits.filterCounterName(counterName); ...
и собственно :
public static String filterName(String name, int maxLen) { return name.length() > maxLen ? name.substring(0, maxLen - 1) : name; } public static String filterCounterName(String name) { return filterName(name, getCounterNameMax()); }
Как видите, имя счетчика сохраняется в усеченном виде по отношению к
mapreduce.job.counters.max
. В свою очередь, в коде Hadoop есть только одно место, гдеLimits.init(Configuration conf)
выполняется вызов ( вызывается изLocalContainerLauncher
класса):class YarnChild { private static final Logger LOG = LoggerFactory.getLogger(YarnChild.class); static volatile TaskAttemptID taskid = null; public static void main(String[] args) throws Throwable { Thread.setDefaultUncaughtExceptionHandler(new YarnUncaughtExceptionHandler()); LOG.debug("Child starting"); final JobConf job = new JobConf(MRJobConfig.JOB_CONF_FILE); // Initing with our JobConf allows us to avoid loading confs twice Limits.init(job);
Я считаю, что вам нужно выполнить следующие шаги, чтобы исправить проблему с именами счетчиков, которую вы наблюдаете:
mapreduce.job.counters.counter.name.max
значение конфигурацииЯ думаю, вы по-прежнему будете видеть сокращенные имена счетчиков для старых вакансий.
источник
getName()
кажется устаревшимВ качестве альтернативы
getUri()
можно использовать максимальную длину по умолчанию 255.Не пробовал лично, но, похоже, это возможное решение этой проблемы.
источник
org.apache.hadoop.fs.FileSystem#getName
но эта тема оorg.apache.hadoop.mapreduce.Counter#getName
поведении.