1

我在单个节点上使用 hadoop 1.0.1,并且正在尝试使用 python 2.7 流式传输制表符分隔的文件。我可以让 Michael Noll 的字数统计脚本使用 hadoop/python 运行,但无法让这个非常简单的映射器和缩减器工作,它只是复制文件。这是映射器:

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

mapper 和 reducer 在 linux 中工作正常:

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

但是在我 chmod 映射器和减速器之后,将输入文件移动到 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!

有任何想法吗?谢谢。

4

2 回答 2

3

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

#!/usr/bin/python
import sys

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

从命令行尝试此操作,以确保 shell 知道使用 python 解释器执行文件:

cat input.txt | ./mapper.py | sort | ./reducer.py > a.out
于 2012-06-03T14:50:17.517 回答
0

除了 Chris White Answer,shebang 标头应该是:

#!/usr/bin/env python

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

#!/usr/bin/env python3

并且不要使用:

#!/usr/bin/python

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

检查此答案以获取更多信息

于 2017-04-30T03:29:30.640 回答