jar hadoop classpath precedence

jar - Anulando los tarros predeterminados de hadoop en la ruta de clase



classpath precedence (5)

Como en la última versión de Hadoop (2.2+), debe configurar:

conf.setBoolean(MRJobConfig.MAPREDUCE_JOB_USER_CLASSPATH_FIRST, true);

He visto muchas manifestaciones de formas de usar la ruta de la clase del usuario como precedente a la de hadoop. Muchas veces esto se hace si un trabajo m / r necesita una versión específica de una biblioteca que hadoop ya usa una versión anterior de (por ejemplo, el json parser de jackson o commons http, etc.)

En cualquier caso: he visto:

mapreduce.task.classpath.user.precedence mapreduce.task.classpath.first mapreduce.job.user.classpath.first

¿Cuál de estos parámetros es el correcto para establecer en la configuración de mi trabajo, a fin de forzar a los asignadores y reductores a tener una ruta de clase que hadoop_classpath jars de hadoop_classpath definidos por el usuario ANTES de los jars de dependencia predeterminados de hadoop?

Por cierto, esto está relacionado con esta pregunta: la aceptación por parte de Dynamodb requestHandler que recientemente encontré se debe a un conflicto jar.


En la distribución de MapR, la propiedad es "mapreduce.task.classpath.user.precedence"
http://www.mapr.com/doc/display/MapR/mapred-site.xml

<property> <name>mapreduce.task.classpath.user.precedence</name> <value>true</value> <description>Set to true if user wants to set different classpath. (AVRO) </description> </property>

jobConf.setUserClassesTakesPrecedence (true);


Entonces, asumiendo que está utilizando 0.20.203, esto se maneja en el código TaskRunner.java siguiente manera:

  • La propiedad que busca está en la línea 94 - mapreduce.user.classpath.first
  • La línea 214 es donde se realiza la llamada para crear la lista de rutas de clase, que se delega en un método llamado getClassPaths(..)
  • getClassPaths() está definido en la línea 524, y debería poder ver que la propiedad de configuración se usa para decidir si sus bibliotecas de trabajo + dist caché, o las bibliotecas hadoop van primero en la ruta de clase.

Para otras versiones de hadoop, es mejor revisar la clase TaskRunner.java para confirmar el nombre de la propiedad de configuración, ya que todo esto es una "configuración semi oculta" :

static final String MAPREDUCE_USER_CLASSPATH_FIRST = "mapreduce.user.classpath.first"; //a semi-hidden config


Esta configuración sirve para hacer referencia a clases de archivos jar externos solo en las tareas de su asignador o reductor. Sin embargo, si los está utilizando en, por ejemplo, un InputFormat personalizado, no podrá cargar la clase. Una forma de asegurarse de que esto también funcione en todas partes (en MR2) es exportar esta configuración al enviar su trabajo:

export HADOOP_USER_CLASSPATH_FIRST=true