Nombre de contador truncado / inconsistente de Hadoop

79

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.maxes para configurar este límite. Así que incrementé esto 500y 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 ToolRunnerI 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:

  1. org.apache.hadoop.mapred.ClientServiceDelegate#getJobCountersEl método devuelve un montón de contadores de hilo con nombres TRUNCADOS y nombres de visualización COMPLETOS .
  2. No pudo depurar mapas y reductores en sí, pero con la ayuda del registro, parece que el org.apache.hadoop.mapreduce.Counter#getNamemétodo funciona correctamente durante la ejecución del reductor.
señor nada
fuente
2
¿Puede proporcionar más detalles sobre la getName()llamada que aún devuelve el nombre truncado? ¿Es esto iterando sobre los contadores devueltos desde Job#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 misma getName()llamada. (No sería retroactiva fix truncado nombres de contador de los trabajos presentados antes del cambio de configuración sin embargo.)
Chris Nauroth
@ChrisNauroth, la configuración es bastante simple, tengo un servidor con hadoop y todo su software adicional instalado en él. El flujo de los contadores en mi map-reduce: 1. Incrementar contadores en reductores (obtenidos del contexto) 2. Obtener del trabajo # getCounters (). Gracias por tu interés y perdón por la demora en la respuesta.
señor nada
1
@ChrisNauroth, hice una investigación adicional y parece que encontré algo ... eh, interesante. Tenemos hadoop 2.6.0 instalado y parece que este problema issues.apache.org/jira/browse/MAPREDUCE-5875 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 ... ¿Crees que esto puede ser un problema?
señor nada
¿Podría decirme el nombre exacto (uno truncado) que obtiene cuando llama a getName () para el contadorstats.counters.server-name.job.job-name.mapper.site.site-name.qualifier.qualifier-name.super-long-string-which-is-not-within-standard-limits
Maxmithun
@DennisJaheruddin desafortunadamente dejé ese trabajo y no tuve más remedio que aplicar algunas soluciones temporales para solucionar este problema, ya que no se proporcionaron comentarios en hadoop jira. Ese problema aún no se resolvió el día que dejé ese trabajo.
señor nada

Respuestas:

2

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.maxcontrola 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 donde Limits.init(Configuration conf)se realiza la llamada a (llamada desde la LocalContainerLauncherclase):

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:

  1. Ajustar mapreduce.job.counters.counter.name.maxvalor de configuración
  2. Reinicie el servicio YARN / MapReduce
  3. Vuelva a ejecutar su trabajo

Creo que todavía verá nombres de contador truncados para trabajos antiguos.

morsik
fuente
A pesar de que soy incapaz de verificar esto debería ser muy útil y explicativa para aquellos que se enfrentan a este problema (de acuerdo con upvotes hay una gran cantidad de tales personas)
mr.nothing
1

getName() parece estar en desuso

Alternativamente, getUri()eso viene con una longitud máxima predeterminada de 255 que se puede usar.

Enlace de documentación: getUri()

No lo he probado personalmente, pero parece ser una posible solución a este problema.

Akash G
fuente
No estoy seguro de haber captado el problema correctamente. Estás hablando, org.apache.hadoop.fs.FileSystem#getNamepero este tema trata org.apache.hadoop.mapreduce.Counter#getNamey su comportamiento.
señor nada