Усеченное / несогласованное имя счетчика 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поведении.
— мистер Ничто
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.