python中的Hadoop Streaming Job失败错误

时间:2010-12-16 11:58:10

标签: python hadoop mapreduce

this guide开始,我成功地进行了示例练习。但是在运行我的mapreduce工作时,我收到以下错误 ERROR streaming.StreamJob: Job not Successful!
10/12/16 17:13:38 INFO streaming.StreamJob: killJob...
Streaming Job Failed!

日志文件中的错误

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

[edit]命令来运行作业:

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

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

谢谢,

7 个答案:

答案 0 :(得分:21)

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

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

当您的脚本位于hdfs中另一个文件夹中的作业中时,该作业相对于执行为“。”的尝试任务。 (仅供参考,如果您想要另一个文件,例如查找表,您可以在Python中打开它,就好像它与您的脚本在M / R作业中的脚本位于同一目录中一样)

还要确保你有chmod a + x mapper.py和chmod a + x reducer.py

答案 1 :(得分:13)

尝试添加

 #!/usr/bin/env python

您的脚本顶部。

或者,

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

答案 2 :(得分:2)

我最近遇到了这个错误,我的问题变成了明显的(事后看来)和其他解决方案一样:

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我也有同样的问题 我尝试了马文·W的解决方案 并且我还安装了spark,请确保您已经安装了spark,不仅安装了pyspark(dependency),还安装了框架installtion tutorial

遵循该教程

答案 5 :(得分:0)

您需要明确指示将mapper和reducer用作python脚本,因为我们有多个流选项。您可以使用单引号或双引号。

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

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

完整命令如下:

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

答案 6 :(得分:0)

如果您在 hadoop cluster 中运行此命令,请确保在 每个 NodeMnager 实例中都安装了 python。 #hadoop