Por ahora, tengo un trabajo de Hadoop que crea contadores con un nombre bastante grande.
Por ejemplo, la siguiente: stats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-within-standard-limits
. Este contador se trunca en la interfaz web y en la getName()
llamada al método. Descubrí que Hadoop tiene limitaciones en el nombre máximo del contador y esta identificación de configuración mapreduce.job.counters.counter.name.max
es para configurar este límite. Así que incrementé esto 500
y la interfaz web ahora muestra el nombre completo del contador. Pero getName()
del contador todavía devuelve el nombre truncado.
¿Podría alguien, por favor, explicarme esto o señalarme mis errores? Gracias.
EDITAR 1
La configuración de mi servidor Hadoop consiste en un servidor único con HDFS, YARN y map-reduce en él. Durante map-reduce, hay algunos incrementos de contador y después de que se completa el trabajo, en ToolRunner
I recupero contadores con el uso de org.apache.hadoop.mapreduce.Job#getCounters
.
EDITAR 2
La versión de Hadoop es la siguiente:
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
Hice una investigación adicional y parece que este problema describe una situación similar a la mía. Pero es bastante confuso porque puedo aumentar el número de contadores pero no la longitud del nombre del contador ...
EDITAR 3
Hoy, dediqué bastante tiempo a depurar los componentes internos de Hadoop. Algunas cosas interesantes:
org.apache.hadoop.mapred.ClientServiceDelegate#getJobCounters
El método devuelve un montón de contadores de hilo con nombres TRUNCADOS y nombres de visualización COMPLETOS .- No pudo depurar mapas y reductores en sí, pero con la ayuda del registro, parece que el
org.apache.hadoop.mapreduce.Counter#getName
método funciona correctamente durante la ejecución del reductor.
getName()
llamada que aún devuelve el nombre truncado? ¿Es esto iterando sobre los contadores devueltos desdeJob#getCounters()
el cliente que envía después de esperar a que se complete el trabajo, o es una aplicación separada que consulta los contadores del servidor del historial de trabajos, o es algo completamente diferente? Espero que su configuración sea suficiente. La interfaz de usuario web utiliza la mismagetName()
llamada. (No sería retroactiva fix truncado nombres de contador de los trabajos presentados antes del cambio de configuración sin embargo.)stats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-within-standard-limits
Respuestas:
No hay nada en el código de Hadoop que trunque los nombres de los contadores después de su inicialización. Entonces, como ya ha señalado,
mapreduce.job.counters.counter.name.max
controla la longitud máxima del nombre del contador (con 64 símbolos como valor predeterminado ).Este límite se aplica durante las llamadas a
AbstractCounterGroup.addCounter/findCounter
. El código fuente respectivo es el siguiente :@Override public synchronized T addCounter(String counterName, String displayName, long value) { String saveName = Limits.filterCounterName(counterName); ...
y de hecho :
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()); }
Como puede ver, el nombre del contador se guarda truncado con respecto a
mapreduce.job.counters.max
. A su vez, solo hay un lugar en el código de Hadoop dondeLimits.init(Configuration conf)
se realiza la llamada a (llamada desde laLocalContainerLauncher
clase):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);
Creo que debe realizar los siguientes pasos para solucionar el problema de nombres de contador que observa:
mapreduce.job.counters.counter.name.max
valor de configuraciónCreo que todavía verá nombres de contador truncados para trabajos antiguos.
fuente
getName()
parece estar en desusoAlternativamente,
getUri()
eso viene con una longitud máxima predeterminada de 255 que se puede usar.No lo he probado personalmente, pero parece ser una posible solución a este problema.
fuente
org.apache.hadoop.fs.FileSystem#getName
pero este tema trataorg.apache.hadoop.mapreduce.Counter#getName
y su comportamiento.