2010-12-02 60 views
8

J'essaie d'exécuter un travail python hadoop-streaming.Hadoop Streaming - Impossible de trouver l'erreur de fichier

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 

Je me suis assuré que mapper.py possède toutes les permissions. Il erreur en disant

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) 

J'ai essayé de copier mapper.py à HDFS et donner les mêmes hdfs: lien //localhost/mapper.py, qui ne fonctionne pas trop! Des idées sur la façon de résoudre ce bug?

+0

Avez-vous résoudre ce problème? Je suis confronté au même problème sur Windows Server 2012. –

Répondre

6

En regardant l'exemple sur le HadoopStreaming wiki page, il semble que vous devriez changer

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

à

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

depuis « fichiers expédiés accédez au répertoire de travail ». Vous devrez peut-être également spécifier l'interpréteur python directement:

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

remercie Brad, mais l'erreur est passée à /System/Library/Frameworks/Python.framework/Versions/2.5/Resources/Python.app/Contents/MacOS/Python: impossible ouvrir le fichier 'mapper.py': [Errno 2] Aucun fichier ou répertoire de ce type java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): échec du sous-processus avec le code 2 – vkris

+0

J'ai un script qui a le fichier -file ../scripts/ mapper.py -mapper ../scripts/mapper.py – Brig

0

Votre mapper.py dispose-t-il des droits d'exécution? Si non, alors vous en avez besoin.

chmod a+x scripts/mapper.py 

fourches Hadoop et exécute le script avant qu'il écrit/lit à std donc vous devez donner l'autorisation d'exécution pour exécuter.

+0

ouais il a. J'ai mentionné dans le post qu'il a toutes les permissions. – vkris

+1

Peut-être que vous devriez aller à l'un de vos nœuds de traqueur de tâches et essayez d'exécuter cat somedata.csv | ./mapper.py vous pourriez trouver une erreur du noeud de données avec quelque chose d'anormal. Est-ce que le répertoire des scripts est un frère de bin et contrib? –

+0

J'essaye de courir dans un mode pseudo-distribué. J'ai essayé de courir avec un cluster réel, donne toujours le même problème. donc en cours d'exécution cat inputfile | ./mapper.py fonctionne !! Oui, le répertoire scripts est un frère de bin, contrib. – vkris

0

Je viens de recevoir la même erreur lorsque mon mappeur retourne une chaîne vide ou vide. Donc, je devais faire un chèque de la valeur:

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! J'ai essayé avec mes données d'entrée, ça fonctionnait quand je l'ai fait cat input.txt | python mapper.py – vkris

+0

Mes données de test passent le chat | mapper.py | test reducer.py aussi. J'ai aussi dû ajouter dans la gestion des erreurs – Brig

3

Votre problème le plus probable est que l'exécutable python n'existe pas sur les esclaves (où TaskTracker est en cours d'exécution). Java donnera le même message d'erreur.

Installez-le partout où il est utilisé. Un fichier que vous pouvez utiliser le tralala que vous avez probablement déjà faites:

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

Assurez-vous que le chemin après le tralala est le même où python est installé sur les TaskTrackers.

+0

Merci, c'était mon problème! Ce qui a fonctionné pour moi était '#!/Usr/bin/env python'. –

1

J'ai rencontré le même problème sur un cluster CDH4 Hadoop essayant d'exécuter un travail python en continu. L'astuce consiste à ajouter dans votre Mapper/fichier réducteur que les premières lignes:

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

Cela fera paraître python dans le répertoire de travail en cours et il devrait alors être en mesure d'exécuter, assurez-vous également que votre tralala est correct .

2

Une autre chose sournoise peut causer cela. Si votre ligne terminaisons sur le script sont de style DOS, votre première ligne (la « ligne tralala ») peut ressembler à ceci à l'œil nu:

#!/usr/bin/python 

...my code here... 

mais ses octets ressembler à ceci au noyau lors de il tente d'exécuter votre script:

% 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 

il est à la recherche d'un exécutable appelé "/usr/bin/python\r", qu'il ne peut pas trouver, il meurt avec "No such file or directory".

Ce bit moi aujourd'hui, encore, donc je devais l'écrire quelque part sur SO.

+0

Pouvons-nous avoir la raison pour laquelle ce vote a été rejeté? – Jeevs

+0

Trouvé la même idée ici: http://stackoverflow.com/questions/20218521/hadoop-streaming-external-mapper-script-file-not-found – Jeevs

+0

J'ai été accroché par celui-ci pendant le week-end. Merci Obama! :RÉ – dave

0

Fichier non trouvé l'erreur parfois ne signifie pas "Fichier non trouvé", à la place cela signifie "Impossible d'exécuter ce script".

Sachant cela, je résolu des problèmes comme celui-ci, lorsque vous faites face à des problèmes (pas java) en streaming je vous suggère de suivre cette liste de contrôle:

  1. Est-ce que les exécuter des scripts? Ne commencez pas à utiliser l'interpréteur, c'est-à-dire python myScript.py rendez-le exécutable au début comme ./myScript.py c'est ainsi que le streaming appelle votre script.
  2. utilisez -verbose pour voir ce qui se passe dans le pot qui sera déployé dans le conteneur, parfois cette aide.
  3. À l'intérieur des conteneurs, les scripts sont des liens symboliques et non réels.
  4. Les fichiers qui sont déplacés à l'aide de -file ne se trouvent pas dans des dossiers. -mapper folder/script.py ou -reducer folder/script.py sont traiter comme script.py
  5. Les conteneurs et tout ce qu'ils contiennent sont supprimés une fois le travail terminé. Si vous voulez voir ce qui se passe dans un conteneur, déplacez-le dans HDFS, IE: remplacez le mappeur ou le réducteur par un .sh script qui fait le travail.

Cette liste de contrôle m'a beaucoup aidé, j'espère peut être utile aussi pour vous.

Ici suit le journal classique avec le message d'erreur ambigu.

C'est vrai, il ne peut pas exécuter le programme.

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 

C'est la raison du mensonge.

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

Lire ceci:

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

Il est un mensonge, le fichier n'existe si verbose il montre dans la liste d'emballage.

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

J'ai rencontré le même problème lors de l'exécution de la carte réduire avec du code python. La solution est la suivante: Nous devons également spécifier "-fichier" devant le mappeur et le réducteur.

est la commande ici:

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