Problema con -libjars en hadoop

Estoy intentando ejecutar el trabajo de MapReduce en Hadoop, pero estoy enfrentando un error y no estoy seguro de qué está pasando. Tengo que pasar los flasks de la biblioteca que mi mapper requiere.

Estoy excitando lo siguiente en la terminal:

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

y recibo 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 (método nativo)

en java.lang.Class.forName (Class.java:247)

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

Por favor ayuda .. Gracias

También vale la pena señalar un punto sutil pero importante: la forma de especificar JAR adicionales para JVM que ejecutan tareas de reducción del mapa distribuido y para el cliente de trabajo en ejecución de JVM es muy diferente.

  • -libjars hace que los Jars solo estén disponibles para las JVM que ejecutan un mapa remoto y reducen la tarea

  • Para hacer que estos mismos JAR estén disponibles para la JVM del cliente (la JVM que se crea cuando ejecuta el comando hadoop jar), debe establecer la variable de entorno HADOOP_CLASSPATH:

 $ 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 incorrecta y la inicialización de la clase de trabajo personalizada.

  • La clase de trabajo debe implementar la interfaz de la herramienta
  • La instancia de la clase de configuración se debe obtener llamando a getConf () en lugar de crear una nueva instancia;

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

Cuando especifica los -LIBJARS con el comando jar de Hadoop. Primero asegúrese de editar su clase de 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 su comando “hadoop jar” como se muestra a continuación:

hadoop jar YourApplication.jar [myDriverClass] args -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 la interfaz TOOL . ToolRunner se utiliza para ejecutar clases que implementan la interfaz de la herramienta. Funciona junto con GenericOptionsParser para analizar los argumentos generics 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 los argumentos generics dados . 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 ();

Encontré la respuesta, estaba arrojando un error porque me faltaba el nombre de la clase “principal” en el comando.

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

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

Gracias