Foro Formación Hadoop

 
 
Imagen de Fernando Agudo
Error Ejecutando Hadoop Streaming - Cannot run program "mapper.py": error=2, No such file or directory
de Fernando Agudo - miércoles, 13 de julio de 2016, 11:21
 

Hola, Nuevamente os indico el error que ha tenido uno de los alumnos por si os sirve de ayuda. También aprovecho para animar a todos los alumnos a publicar aquí los errores para poder aprender todos juntos ;).

Un saludo.

 

Error: Se ha encontrado con el siguiente error al ejecutar el ejercicio de Hadoop Streaming:

 

16/07/12 09:30:31 INFO mapreduce.Job: Task Id : attempt_1468338986060_0002_m_000001_0, Status : FAILED
Error: java.lang.RuntimeException: Error in configuring object
    at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:109)
    at org.apache.hadoop.util.ReflectionUtils.setConf(ReflectionUtils.java:75)
    at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:133)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:449)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
    at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:163)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:415)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.apache.hadoop.util.ReflectionUtils.setJobConf(ReflectionUtils.java:106)
    ... 9 more

Caused by: java.io.IOException: Cannot run program "mapper.py": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
    at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:208)
    ... 23 more
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:186)
    at java.lang.ProcessImpl.start(ProcessImpl.java:130)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
    ... 24 more

 

Solución:

El error se debe a que no encuentra el fichero mapper.py:


 Caused by: java.io.IOException: Cannot run program "mapper.py":
 error=2, No such file or directory
     at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
     at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:208)
     ... 23 more
 Caused by: java.io.IOException: error=2, No such file or director


Los comandos necesarios para ejecutar la instrucción son:

-input (directorio que quieres procesar - HDFS)
-ouput (directorio de salida donde almacenar los datos, no debe existir - HDFS)
-file (script que necesitas enviar al cluster hadoop para ejecutar el MapReduce, se puede llamar tantas veces como scripts necesites enviar al cluster)
-mapper (script que necesitas ejecutar para la fase mapper)
-reducer (script que necesitas ejecutar para la fase reducer)


Si te das cuenta en tu instrucción en los argumentos -file le estás pasando el directorio, no el fichero, es ahí donde tienes el error:
-file ../python_sample_solution/
-file ../python_sample_solution/

python_sample_solution]$ hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-*.jar -input /formacionhadoop/desarrollador/cervantes/novela/quijote.txt -output /formacionhadoop/desarrollador/streaming4 -file ../python_sample_solution/ -file ../python_sample_solution/ -mapper mapper.py -reducer reducer.py

- La solución correcta sería:
python_sample_solution]$ hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-streaming-*.jar -input /formacionhadoop/desarrollador/cervantes/novela/quijote.txt -output /formacionhadoop/desarrollador/streaming4 -file ../python_sample_solution/mapper.py -file ../python_sample_solution/reducer.py -mapper mapper.py -reducer reducer.py

 

Moraleja: Hay que indicar todos los ficheros/scripts que necesitamos enviar al clúster para ejecutar el MapReduce, no la ruta ;)

Espero que os sirva de ayuda.

Un saludo,