Усеченное / несогласованное имя счетчика Hadoop

79

На данный момент у меня есть задание 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. Несколько интересных вещей:

  1. org.apache.hadoop.mapred.ClientServiceDelegate#getJobCountersметод возвращает набор счетчиков из пряжи с ОБРЕЗАННЫМИ именами и ПОЛНЫМИ отображаемыми именами.
  2. Не удалось отладить сами карты и редукторы, но с помощью регистрации кажется, что org.apache.hadoop.mapreduce.Counter#getNameметод работает правильно во время выполнения редуктора.
мистер ничего
источник
2
Не могли бы вы предоставить более подробную информацию о getName()вызове, который по-прежнему возвращает усеченное имя? Это итерация по счетчикам, возвращаемым из Job#getCounters()отправляющего клиента после ожидания завершения задания, или это отдельное приложение, запрашивающее счетчики с сервера истории заданий, или это что-то совсем другое? Я ожидаю, что вашей конфигурации будет достаточно. Веб-интерфейс использует тот же getName()вызов. (Тем не менее, он не будет задним числом исправлять усеченные имена счетчиков из заданий, отправленных до изменения конфигурации.)
Крис Наур
@ChrisNauroth, настройка довольно проста, у меня есть один сервер с hadoop и все это дополнительное программное обеспечение, установленное на нем. Поток счетчиков в моей карте-reduce: 1. Увеличение счетчиков в редукторах (извлекается из контекста) 2. Извлекается из задания # getCounters (). Благодарим за проявленный интерес и извиняемся за задержку с ответом.
mr.nothing
1
@ChrisNauroth, я провел дополнительное расследование и, кажется, нашел кое-что ... ну, интересное. У нас установлен hadoop 2.6.0, и кажется, что эта проблема issues.apache.org/jira/browse/MAPREDUCE-5875 описывает ситуацию, аналогичную моей. Но это довольно сбивает с толку, потому что я могу увеличить количество счетчиков, но не длину имени счетчика ... Как вы думаете, это может быть проблемой?
mr.nothing
Не могли бы вы назвать мне точное имя (усеченное), которое вы получаете, когда вызываете getName () для счетчикаstats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-within-standard-limits
maxmithun
@DennisJaheruddin, к сожалению, я оставил эту работу, и у меня не было выбора, кроме как применить некоторые временные решения для обхода этой проблемы, поскольку в hadoop jira не было обратной связи. Эта проблема все еще не была решена к тому моменту, когда я уволился с этой работы.
mr.nothing

Ответы:

2

В коде 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);

Я считаю, что вам нужно выполнить следующие шаги, чтобы исправить проблему с именами счетчиков, которую вы наблюдаете:

  1. Отрегулируйте mapreduce.job.counters.counter.name.maxзначение конфигурации
  2. Перезапустите службу YARN / MapReduce.
  3. Снова запустите свою работу

Я думаю, вы по-прежнему будете видеть сокращенные имена счетчиков для старых вакансий.

Морсик
источник
Хотя я не могу это проверить, это должно быть очень полезным и объяснительным для тех, кто сталкивается с этой проблемой (согласно положительным голосам, таких людей много)
мистер Ничто
1

getName() кажется устаревшим

В качестве альтернативы getUri()можно использовать максимальную длину по умолчанию 255.

Ссылка на документацию: getUri()

Не пробовал лично, но, похоже, это возможное решение этой проблемы.

Акаш Г
источник
Не уверен, что вы правильно поняли проблему. Вы говорите, org.apache.hadoop.fs.FileSystem#getNameно эта тема о org.apache.hadoop.mapreduce.Counter#getNameповедении.
мистер Ничто