2010-12-02 49 views
8

Estoy tratando de ejecutar un trabajo de python hadoop-streaming.Hadoop Streaming - No se puede encontrar el archivo de error

bin/hadoop jar contrib/streaming/hadoop-0.20.1-streaming.jar 
-D stream.non.zero.exit.is.failure=true 
-input /ixml 
-output /oxml 
-mapper scripts/mapper.py 
-file scripts/mapper.py 
-inputreader "StreamXmlRecordReader,begin=channel,end=/channel" 
-jobconf mapred.reduce.tasks=0 

Me aseguré de que mapper.py tenga todos los permisos. Él los errores sin decir

Caused by: java.io.IOException: Cannot run program "mapper.py":  
error=2, No such file or directory 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460) 
    at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:214) 
... 19 more 
Caused by: java.io.IOException: error=2, No such file or directory 
    at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.(UNIXProcess.java:53) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:91) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:453) 

He intentado copiar mapper.py a hdfs y dar a los mismos hdfs: //localhost/mapper.py enlace, que no funciona demasiado! ¿Alguna idea sobre cómo solucionar este error?

+0

los solucionaron este problema? Estoy enfrentando el mismo problema en Windows Server 2012. –

Respuesta

6

Mirando el ejemplo de la HadoopStreaming wiki page, parece que debe cambiar

-mapper scripts/mapper.py 
-file scripts/mapper.py 

a

-mapper mapper.py 
-file scripts/mapper.py 

ya que "envían archivos van al directorio de trabajo". Es posible que también deba especificar el intérprete de Python directamente:

-mapper /path/to/python mapper.py 
-file scripts/mapper.py 
+0

gracias Brad, pero el error cambió a /System/Library/Frameworks/Python.framework/Versions/2.5/Resources/Python.app/Contents/MacOS/Python: no se puede abrir el archivo 'mapper.py': [Errno 2] No existe ese archivo o directorio java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): el subproceso falló con el código 2 – vkris

+0

Tengo un script en funcionamiento que tiene -file ../scripts/ mapper.py -mapper ../scripts/mapper.py – Brig

0

¿Tiene su mapper.py permiso de ejecución en él? Si no, entonces lo necesitas.

chmod a+x scripts/mapper.py 

horquillas de Hadoop y ejecuta el script antes de que escribe/lee std Así que hay que darle permisos de ejecución para funcionar.

+0

sí, sí. Mencioné en la publicación que tiene todos los permisos. – vkris

+1

Tal vez deberías ir a uno de tus nodos de rastreador de tareas e intentar ejecutar cat somedata.csv | ./mapper.Es posible que encuentre un error del nodo de datos con algo anómalo. También es el directorio de scripts un hermano de bin y contrib? –

+0

Estoy intentando ejecutar en un modo pseudo distribuido. Intenté ejecutar con un clúster real, todavía da el mismo problema. así que ejecutar el archivo de entrada de gato | ./mapper.py funciona !! Sí, el directorio de scripts es un hermano de bin, contrib. – vkris

0

Acabo de recibir el mismo error cuando mi asignador devuelve una cadena nula o vacía. Así que tuve que hacer un cheque por el valor:

try: 
    # Skip over any errors 

    word = words[18].strip() 

     if (len(word) == 0): 
      word = "UKNOWN" 

    print '%s\t%s' % (word, 1) 

except Value: 
    pass 
+0

ooh! Intenté con mis datos de entrada, estaba funcionando cuando lo hice cat input.txt | python mapper.py – vkris

+0

Mis datos de prueba pasan el gato | mapper.py | Prueba de reducer.py también. También tuve que agregar un error al manejar – Brig

3

Su problema más probable es que pitón ejecutable no existe en los esclavos (donde TaskTracker se está ejecutando). Java dará el mismo mensaje de error.

Instalarlo en cualquier lugar donde se use. Un archivo se puede utilizar tinglado como probablemente ya lo hacen:

#!/usr/bin/python -O 
rest 
of 
the 
code 

Asegúrese de que la ruta de acceso después de que el tinglado es el mismo donde está instalado el pitón en los TaskTrackers.

+0

¡Gracias, ese era mi problema! Lo que funcionó para mí fue '#!/Usr/bin/env python'. –

1

Me encontré con el mismo problema en un clúster CDH4 Hadoop tratando de ejecutar un trabajo de python de transmisión. El truco consiste en añadir en el archivo de aplicador/reductor como las primeras líneas:

import sys 
sys.path.append('.') 

Esto hará mirada pitón en el directorio de trabajo actual y debe entonces ser capaz de correr, también asegurarse de que su tinglado es correcta .

2

Otra cosa furtiva puede causar esto. Si sus terminaciones de líneas en el guión son DOS-estilo, a continuación, su primera línea (la "línea tinglado") puede tener este aspecto a simple vista:

#!/usr/bin/python 

...my code here... 

pero sus bytes vería así al núcleo cuando se trata de ejecutar la secuencia de comandos:

% od -a myScript.py 
0000000 # ! / u s r / b i n / p y t h o 
0000020 n cr nl cr nl . . . m y sp c o d e sp 
0000040 h e r e . . . cr nl 

está buscando un ejecutable llamado "/usr/bin/python\r", que no se puede encontrar, por lo que muere con "No such file or directory".

Esto me mordió hoy, nuevamente, así que tuve que escribirlo en algún lugar en SO.

+0

¿Podemos tener la razón por la cual se votó negativamente? – Jeevs

+0

Encontré el mismo pensamiento aquí: http://stackoverflow.com/questions/20218521/hadoop-streaming-external-mapper-script-file-not-found – Jeevs

+0

Se enganchó con este durante el fin de semana. ¡Gracias Obama! :RE – dave

0

El error de archivo no encontrado a veces no significa "Archivo no encontrado", sino que significa "No se puede ejecutar este script".

Sabiendo esto he resuelto problemas como éste, cuando se enfrentan con problemas (sin Java) en el streaming le sugiero que siga esta lista de comprobación:

  1. se ejecuta las secuencias de comandos? No comenzar utilizando el intérprete, es decir, python myScript.py hacer que sea ejecutable en el inicio como ./myScript.py esta es la forma en que la transmisión llamará a su secuencia de comandos.
  2. usa -verbose para ver qué entra en el contenedor que se desplegará en el contenedor, alguna vez esta ayuda.
  3. Dentro de los contenedores, los scripts no son archivos reales.
  4. Los archivos que se mueven utilizando -file no están en las carpetas. -mapper folder/script.py o -reducer folder/script.py se tratan como script.py
  5. Los contenedores y cualquier cosa que contenga se eliminan después de completar el trabajo, si quiere ver lo que sucede en un contenedor muévalo a HDFS, IE: reemplazando el asignador o el reductor con .sh script que hace el trabajo.

Esta lista de verificación me ayudó mucho, espero que pueda ser útil también para usted.

Aquí sigue el registro clásico con el mensaje de error ambiguo.

Es cierto, no puede ejecutar el programa.

Caused by: java.io.IOException: Cannot run program "/hadoop/yarn/local/usercache/root/appcache/application_1475243242823_0007/container_1475243242823_0007_01_000004/./reducer.py": 
error=2, No such file or directory 

Es la razón por la mentira.

at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047) 
    at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:209) 
    ... 15 more 

Lea esto:

Caused by: java.io.IOException: error=2, No such file or directory 

que es una mentira, no existe archivo si -verbose muestra en la lista de embalaje.

at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:187) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:130) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028) 
0

Me he enfrentado el mismo problema al ejecutar map reducir con el código python. La solución es: tenemos que especificar "-file" también delante de mapper y reductor.

Este es el comando:

hadoop jar /opt/cloudera/parcels/CDH-5.12.2-1.cdh5.12.2.p0.4/lib/hadoop-mapreduce/hadoop-streaming-2.6.0-cdh5.12.2.jar **-file /home/mapper.py** -mapper /home/mapper.py **-file /home/reducer.py** -reducer /home/reducer.py -input /system/mainstream/tmp/file.txt -output /system/mainstream/tmp/output 
Cuestiones relacionadas