На данный момент у меня есть задание 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()вызов. (Тем не менее, он не будет задним числом исправлять усеченные имена счетчиков из заданий, отправленных до изменения конфигурации.)