web-dev-qa-db-fra.com

Hadoop Streaming Job a échoué en python

De ce guide , j’ai réussi à exécuter l’exemple d’exercice. Mais en exécutant mon travail mapreduce, j'obtiens l'erreur suivante
ERROR streaming.StreamJob: Job not Successful!
10/12/16 17:13:38 INFO streaming.StreamJob: killJob...
Streaming Job Failed!

Erreur du fichier journal 

Java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 2
at org.Apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.Java:311)
at org.Apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.Java:545)
at org.Apache.hadoop.streaming.PipeMapper.close(PipeMapper.Java:132)
at org.Apache.hadoop.mapred.MapRunner.run(MapRunner.Java:57)
at org.Apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.Java:36)
at org.Apache.hadoop.mapred.MapTask.runOldMapper(MapTask.Java:358)
at org.Apache.hadoop.mapred.MapTask.run(MapTask.Java:307)
at org.Apache.hadoop.mapred.Child.main(Child.Java:170)

Mapper.py

import sys

i=0

for line in sys.stdin:
    i+=1
    count={}
    for Word in line.strip().split():
        count[Word]=count.get(Word,0)+1
    for Word,weight in count.items():
        print '%s\t%s:%s' % (Word,str(i),str(weight))

Réducteur.py 

import sys

keymap={}
o_Tweet="2323"
id_list=[]
for line in sys.stdin:
    Tweet,tw=line.strip().split()
    #print Tweet,o_Tweet,tweet_id,id_list
    Tweet_id,w=tw.split(':')
    w=int(w)
    if Tweet.__eq__(o_Tweet):
        for i,wt in id_list:
            print '%s:%s\t%s' % (Tweet_id,i,str(w+wt))
        id_list.append((Tweet_id,w))
    else:
        id_list=[(Tweet_id,w)]
        o_Tweet=tweet

[edit] commande pour exécuter le travail: 

hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.20.0-streaming.jar -file /home/hadoop/mapper.py -mapper /home/hadoop/mapper.py -file /home/hadoop/reducer.py -reducer /home/hadoop/reducer.py -input my-input/* -output my-output

L'entrée est une séquence aléatoire de phrases.

Merci,

19
db42

Votre -mapper et -reducer devraient juste être le nom du script.

hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.20.0-streaming.jar -file /home/hadoop/mapper.py -mapper mapper.py -file /home/hadoop/reducer.py -reducer reducer.py -input my-input/* -output my-output

Lorsque vos scripts sont dans le travail qui se trouve dans un autre dossier de hdfs, ce qui est relatif à la tâche de tentative s’exécutant en tant que "." (Pour votre information, si vous souhaitez ajouter un autre fichier tel qu'une table de correspondance, vous pouvez l'ouvrir en Python comme s'il se trouvait dans le même répertoire que vos scripts lorsque votre script est en mode M/R)

assurez-vous également que vous avez chmod a + x mapper.py et chmod a + x réducteur.py

21
Joe Stein

Essayez d'ajouter 

 #!/usr/bin/env python

haut de votre script.

Ou, 

-mapper 'python m.py' -reducer 'r.py'
13
Marvin W

J'ai récemment rencontré cette erreur et mon problème s'est avéré être quelque chose d'aussi évident (avec le recul) que ces autres solutions:

J'ai simplement eu un bug dans mon code Python. (Dans mon cas, j’utilisais le formatage de chaîne Python v2.7 alors que le cluster AWS EMR que j’avais utilisait Python v2.6).

Pour rechercher l'erreur Python réelle, accédez à l'interface utilisateur Web de Job Tracker (dans le cas d'AWS EMR, le port 9100 pour AMI 2.x et le port 9026 pour AMI 3.x); trouver le mappeur échoué; ouvrir ses journaux; et lisez la sortie stderr.

2
Dolan Antenucci

Moi aussi, j’ai eu le même problème J’ai essayé la solution de marvin W Et j’ai également installé spark, s’assure que vous avez bien installé spark, pas seulement pyspark (dépendance), mais aussi installé le tutoriel framework installtion

suivez ce tutoriel

0
yunus

Vous devez indiquer explicitement que le mappeur et le réducteur sont utilisés comme script python, car nous avons plusieurs options pour la diffusion en continu. Vous pouvez utiliser des guillemets simples ou doubles. 

-mapper "python mapper.py" -reducer "python reducer.py" 

ou 

-mapper 'python mapper.py' -reducer 'python reducer.py'

La commande complète va comme ceci:

hadoop jar /path/to/hadoop-mapreduce/hadoop-streaming.jar \
-input /path/to/input \
-output /path/to/output \
-mapper 'python mapper.py' \
-reducer 'python reducer.py' \
-file /path/to/mapper-script/mapper.py \
-file /path/to/reducer-script/reducer.py
0
Gopal Jha

assurez-vous que votre répertoire d'entrée ne contient que les fichiers corrects

0
user6454733