2010-12-16 68 views
18

this guide开始,我已成功运行示例练习。但在运行我的MapReduce工作,我从日志文件Python中的Hadoop Streaming Job失败错误

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)) 

Reducer.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 

收到以下错误
ERROR streaming.StreamJob: Job not Successful!
10/12/16 17:13:38 INFO streaming.StreamJob: killJob...
Streaming Job Failed!

错误命令来运行作业:

[email protected]:/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 

输入是句子的任意随机序列。

谢谢,

回答

19

您的-mapper和-reducer应该只是脚本名称。

[email protected]:/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 

当你的脚本是在是在另一个文件夹内HDFS的工作,这是相对于作为执行任务的尝试“” (仅供参考,如果您想要另外添加一个文件,例如查找表,您可以在Python中打开它,就好像它与您的脚本位于相同的目录中,而脚本处于M/R作业中)

也可以确保您有存取权限chmod a + X mapper.py和chmod一+ X reducer.py

+0

感谢您的答复,但我仍然收到相同的错误。 – db42 2010-12-17 05:08:05

+8

尝试将#!/ usr/bin/env python添加到您的python脚本的顶部,它应该能够通过执行cat data.file | ./mapper.py | sort | ./reducer从命令行执行。 py,并且它不会在文件 – 2010-12-17 07:26:03

+0

顶部的“#!/ usr/bin/env python”感谢Joe,那就是诀窍。 – db42 2010-12-17 10:54:34

12

尝试添加脚本的

#!/usr/bin/env python 

顶部。

或者,

-mapper 'python m.py' -reducer 'r.py' 
+0

太棒了!它在向头添加“#!/ usr/bin/env python”时解决了我的问题。 – 2016-07-24 20:55:59

+0

该死的,通过vim复制粘贴代码删除了'#!',并为我造成了这个问题。感谢提醒添加标题! – asgs 2017-06-05 19:31:45

2

我遇到了这个错误最近,我的问题竟然是因为这些其他解决方案那样明显的东西(事后):

我只是有一个错误在我的Python代码。 (就我而言,我使用的是Python v2.7字符串格式,而我使用的AWS EMR集群是使用Python v2.6)。

要找到实际的Python错误,请转到Job Tracker Web UI(对于AWS EMR,端口9100用于AMI 2.x,端口9026用于AMI 3.x);找到失败的映射器;打开它的日志;并读取stderr输出。

0

确保您的输入目录只包含正确的文件

+0

我有这个问题..我没有任何问题在hadoop外运行...但我在这里尝试的建议,并没有看到任何日志..任何其他方式来调试此问题 – 2017-02-07 07:43:15