2012-06-03 126 views
1

我在单个节点上使用hadoop 1.0.1,我试图使用python 2.7流化制表符分隔文件。我可以让迈克尔诺尔的字数统计脚本使用hadoop/python运行,但无法得到这个非常简单的映射器和简化器来工作,只是复制文件。这里的映射:Hadoop流在地图/减少操作的中间崩溃

import sys 

for line in sys.stdin: 
    line = line.strip() 
    print '%s' % line 

这里的减速机:

import sys 

for line in sys.stdin: 
    line = line.strip() 
    print line 

这里的输入文件的一部分:

1 857774.000000 
2 859164.000000 
3 859350.000000 
... 

的Linux中的映射器和减速做工精细:

cat input.txt | python mapper.py | sort | python reducer.py > a.out 

但我chmod m后冲击片雷管和减速机,输入文件移动到HDFS并检查它的存在和运行:

bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar -file mapperSimple.py -mapper mapperSimple.py -file reducerSimple.py -reducer reducerSimple.py -input inputDir/* -output outputDir 

我得到以下错误:

12/06/03 10:19:11 INFO streaming.StreamJob: map 0% reduce 0% 
12/06/03 10:20:15 ERROR streaming.StreamJob: Job not successful. Error: # of failed Map Tasks exceeded allowed limit. FailedCount: 1. LastFailedTask: task_201206030550_0003_m_000001 
12/06/03 10:20:15 INFO streaming.StreamJob: killJob... 
Streaming Job Failed! 

任何想法?谢谢。

回答

3

你的python文件是否有shebang/hashbang头文件?我想你的问题是,当Java来执行映射器python文件,它要求os执行文件,并且没有shebang/hashbang记法时,它不知道如何执行该文件。我也将确保您的文件标有可执行权限(chmod a+x mapperSimple.py):

#!/usr/bin/python 
import sys 

for line in sys.stdin: 
    line = line.strip() 
    print '%s' % line 

在命令行试试这个,以保证外壳知道用Python解释器来执行文件:

cat input.txt | ./mapper.py | sort | ./reducer.py > a.out 
+0

谢谢,克里斯。我的大脑总是忽视注释符号,所以我最终花了20个小时削减了我的代码并尝试了我所能想到的每一个变化。非常感激。 – user1106278

0

在除了Chris White Answer,shebang头文件应该是:

#!/usr/bin/env python 

默认情况下会使用python2.7。如果你想使用python3,你可以使用:

#!/usr/bin/env python3 

,不要使用:

#!/usr/bin/python 

,因为它会在大多数计算机上失败..包括我的**** ****叹息

请检查这个Answer了解更多信息