De ce guide , j’ai réussi à exécuter l’exemple d’exercice. Mais en exécutant mon travail mapreduce, j'obtiens l'erreur suivanteERROR 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,
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
Essayez d'ajouter
#!/usr/bin/env python
haut de votre script.
Ou,
-mapper 'python m.py' -reducer 'r.py'
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.
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
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
assurez-vous que votre répertoire d'entrée ne contient que les fichiers corrects