2011-07-31 10 views
8

Estoy intentando ejecutar el trabajo de MapReduce en Hadoop, pero me aparece un error y no estoy seguro de qué está pasando. Tengo que pasar los frascos de la biblioteca, que mi mapper requiere.Problema con -libjars en hadoop

estoy excuting lo siguiente en el terminal:

hadoop @ ubuntu:/usr/local/bin hadoop $/hadoop frasco /home/hadoop/vardtst.jar -libjars /home/hadoop/clui.jar -libjars /home/hadoop/model.jar Gutenberg ou101

y yo estoy haciendo la siguiente excepción:

en java.net.URLClassLoader $ 1.run (URLClassLoader.java:202)

en java .security.AccessController.doPrivileged (Método nativo)

en java.net.URLClassLoader.findClass (URLClassLoader.java:190)

en java.lang.ClassLoader.loadClass (ClassLoader.java:306)

en java.lang.ClassLoader.loadClass (ClassLoader.java:247)

en java.lang.Class.forName0 (nativo Método)

en Java.Lang.Class.forName (Class.java:247)

en org.apache. hadoop.util.RunJar.main (RunJar.java:149)

por favor ayuda ..Thanks

+1

Creo que la sintaxis 'libjars' te tiene dando una lista separada por comas como' -libjars jar1, jar2, jar3'. [Opciones genéricas] (http://hadoop.apache.org/common/docs/r0.20.2/commands_manual.html#Generic+Options) referencia. –

+0

@Matt - Todavía recibo el mismo error –

+0

Compruebe mi respuesta aquí, le he explicado todas las opciones disponibles para solucionar este problema aquí: http://stackoverflow.com/a/36227260/1766402 – Isaiah4110

Respuesta

3

he encontrado la respuesta, que estaba tirando de error porque yo estaba perdiendo en el nombre de "principal" de clase en el comando.

La forma correcta de ejecutar es: hadoop @ ubuntu:/usr/local/bin hadoop $/hadoop frasco /home/hadoop/vardtst.jar /home/hadoop/clui.jar,/home/ VardTest -libjars hadoop/model.jar gutenberg ou101

donde VardTest es la clase que contiene el método main().

Gracias

+7

Esto no funciona para yo en Hadoop 2.2 - Hadoop solo está tomando la opción "-libjars" y la ruta de jar y usándola como argumentos para mi clase principal. – neuromouse

17

También vale la pena señalar sutil pero importante punto: la forma de especificar JAR adicionales para las JVM que ejecutan mapa distribuido a reducir las tareas y para JVM que ejecuta el cliente de trabajo es muy diferente.

  • -libjars hace tarros sólo está disponible para máquinas virtuales de Java que se ejecutan mapa remoto y reducir la tarea

  • Para hacer estos mismos de disposición JAR al cliente JVM (La JVM que se crea cuando se ejecuta el comando jar hadoop) necesitan para establecer HADOOP_CLASSPATH variable de entorno:

$ export LIBJARS=/path/jar1,/path/jar2 
$ export HADOOP_CLASSPATH=/path/jar1:/path/jar2 
$ hadoop jar my-example.jar com.example.MyTool -libjars ${LIBJARS} -mytoolopt value 

Ver: http://grepalex.com/2013/02/25/hadoop-libjars/

Otra causa del comportamiento incorrecto de los límbidos podría ser una implementación e inicialización incorrecta de la clase de trabajo personalizada.

  • clase de empleo debe implementar la interfaz de la herramienta
  • instancia de clase
  • configuración debe ser obtenida llamando getconf() en lugar de crear nueva instancia;

Ver: http://kickstarthadoop.blogspot.ca/2012/05/libjars-not-working-in-custom-mapreduce.html

+0

Woohoo, gracias! Agregar el jar a HADOOP_CLASSPATH funcionó para mí. – grinch

+0

'HADOOP_CLASSPATH' hizo el truco. Después de actualizar a Hadoop 2, 'libjars' no me funcionaba. – Swanand

3

Cuando está especificando los -LIBJARS con el comando jar Hadoop. Primero asegúrese de que edita su clase del controlador, como se muestra a continuación:

public class myDriverClass extends Configured implements Tool { 

     public static void main(String[] args) throws Exception { 
     int res = ToolRunner.run(new Configuration(), new myDriverClass(), args); 
     System.exit(res); 
     } 

     public int run(String[] args) throws Exception 
     { 

     // Configuration processed by ToolRunner 
     Configuration conf = getConf(); 
     Job job = new Job(conf, "My Job"); 

     ... 
     ... 

     return job.waitForCompletion(true) ? 0 : 1; 
    } 
} 

Ahora edite el comando de "tarro de Hadoop", como se muestra a continuación:

hadoop tarro YourApplication.jar [] args myDriverClass -libjars ruta/a/jar/archivo

Ahora vamos a entender lo que sucede debajo. Básicamente estamos manejando los nuevos argumentos de línea de comando implementando el TOOL Interface. ToolRunner se utiliza para ejecutar clases que implementan la interfaz de la herramienta. Funciona junto con GenericOptionsParser para analizar los argumentos genéricos de la línea de comandos de hadoop y modifica la configuración de la herramienta.

Dentro de nuestro Main() estamos llamando a ToolRunner.run (new Configuration(), new myDriverClass(), args) - esto ejecuta la herramienta dada por Tool.run (String []), después de analizar con el dado argumentos genéricos. Utiliza la configuración dada, o crea una si es nula y luego establece la configuración de la herramienta con la versión posiblemente modificada de la conf.

Ahora dentro del método de ejecución, cuando llamamos a getConf() obtenemos la versión modificada de la Configuración. Así que asegúrese de tener la siguiente línea en su código. Si implementa todo lo demás y sigue haciendo uso de Configuración conf = nueva Configuración(), nada funcionaría.

Configuración conf = getConf();

+0

@flexo: He editado la respuesta para satisfacer las necesidades específicas de esta pregunta. – Isaiah4110