google - Problema con-libjars en hadoop
mapreduce mongodb (3)
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 frascos 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
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
También vale la pena tener en cuenta un punto sutil pero importante: la forma de especificar JAR adicionales para JVM que ejecutan tareas de reducción de mapas distribuidos y para JVM ejecutar tareas cliente 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 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 los argumentos genéricos 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 ();