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