2010-12-06 22 views
5

Quiero ejecutar una cadena de trabajos para reducir mapas, por lo que la solución más fácil parece ser el controlador de trabajo. decir que tengo dos trabajos, trabajo1 y trabajo2. y quiero ejecutar job2 después de job1. Bueno, enfrentaba algunos problemas. después de horas de depuración, que redujo el código para estas líneas:ejecutando múltiples trabajos de MapReduce en hadoop

JobConf jobConf1 = new JobConf(); 
JobConf jobConf2 = new JobConf(); 
System.out.println("*** Point 1"); 
Job job1 = new Job(jobConf1); 
System.out.println("*** Point 2"); 
Job job2 = new Job(jobConf2); 
System.out.println("*** Point 3"); 

sigo recibiendo esta salida cuando se ejecuta el código:

*** Point 1  
10/12/06 17:19:30 INFO jvm.JvmMetrics: Initializing JVM Metrics with processName=JobTracker, sessionId= 
*** Point 2  
10/12/06 17:19:30 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized 
*** Point 3 

Lo que supongo es que mi problema está relacionado de alguna manera " no se puede inicializar JMV .... "línea. ¿Que es eso? Y cómo puedo instanciar más de un trabajo, para pasarlos a JobController.

Cuando añadí job1.waitForTheCompletion (verdadero) antes de iniciar el segundo trabajo, me dio este error:

10/12/07 11:28:21 INFO jvm.JvmMetrics: Cannot initialize JVM Metrics with processName=JobTracker, sessionId= - already initialized 
Exception in thread "main" org.apache.hadoop.mapreduce.lib.input.InvalidInputException: Input path does not exist: file:/home/workspace/WikipediaSearch/__TEMP1 
     at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:224) 
     at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:241) 
     at org.apache.hadoop.mapred.JobClient.writeNewSplits(JobClient.java:885) 
     at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:779) 
     at org.apache.hadoop.mapreduce.Job.submit(Job.java:432) 
     at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:447) 
     at ch.ethz.nis.query.HadoopQuery.run(HadoopQuery.java:353) 
     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) 
     at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:79) 
     at ch.ethz.nis.query.HadoopQuery.main(HadoopQuery.java:308) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.hadoop.util.RunJar.main(RunJar.java:156) 

__Temp1 es la carpeta de salida de la primera tarea, lo que yo quiero ser la entrada para el segundo. Y a pesar de que tengo esta línea waitForCompletion en mi código, sigue quejándose de que esta ruta no existe.

Respuesta

5

Wowww, después de dos días de depuración, resulta que el problema es con la regla de nombres de directorios internos de hadoop. Aparentemente, para los directorios map-reduce de entrada o salida, uno no puede elegir nombres que comienzan con el subrayado "_". ¡Ese estupido! Y las advertencias y el error no fueron de ninguna ayuda.

+0

La documentación de Hadoop es ciertamente menos que perfecta. Recuerdo que me llevó mucho tiempo aprender que las subclases de InputSplit deben implementar Writable. Uno pensaría que lo mencionarían en la documentación de InputSplit en alguna parte. Todavía no he logrado ejecutar con éxito un trabajo hadoop sin antes empacarlo en un contenedor. – dspyz

0

¿Es posible que no pueda crear un trabajo mientras que otro no ha terminado? Yo uso hadoop 0.20.2 (tenga en cuenta que JobConf está en desuso. Hadoop afirma que admite compatibilidad con versiones anteriores, pero en mi experiencia, en realidad no lo hace) y básicamente hice lo mismo y nunca tuve ese problema. ¿Todavía tiene el problema si agrega job1.waitForCompletion (true) antes de crear job2?

+0

Hola, sí En realidad, he probado todos los escenarios, incluido este: for (int i = 0; i <2; i ++) {Job job = new Job (getConf(), "iteration"); InitializeTheJob; job.wait.waitForCompletion (true); } Y sigo recibiendo la misma advertencia. y luego algo nuevo sucedió. Actualicé la publicación de la pregunta principal para que pueda ver el problema. – narengi

Cuestiones relacionadas