Hadoop Streaming - 找不到文件错误

8 投票
9 回答
17543 浏览
提问于 2025-04-16 07:57

我正在尝试运行一个使用 Hadoop Streaming 的 Python 任务。

bin/hadoop jar contrib/streaming/hadoop-0.20.1-streaming.jar 
-D stream.non.zero.exit.is.failure=true 
-input /ixml 
-output /oxml 
-mapper scripts/mapper.py 
-file scripts/mapper.py 
-inputreader "StreamXmlRecordReader,begin=channel,end=/channel" 
-jobconf mapred.reduce.tasks=0 

我确保 mapper.py 文件有所有的权限。但是它报错了,提示信息是:

Caused by: java.io.IOException: Cannot run program "mapper.py":     
error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:460)
    at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:214)
... 19 more
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.(UNIXProcess.java:53)
    at java.lang.ProcessImpl.start(ProcessImpl.java:91)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:453)

我试着把 mapper.py 复制到 HDFS 上,并使用同样的 hdfs://localhost/mapper.py 链接,但这样也不行!有没有什么建议可以解决这个问题?

9 个回答

2

还有一个比较隐蔽的原因可能会导致这个问题。如果你的脚本文件使用的是DOS风格的换行符,那么你第一行的内容(也就是“shebang行”)在肉眼看起来可能是这样的:

#!/usr/bin/python

...my code here...

但是当系统尝试执行你的脚本时,它看到的字节却是这样的:

% od -a myScript.py
0000000   #   !   /   u   s   r   /   b   i   n   /   p   y   t   h   o
0000020   n  cr  nl  cr  nl   .   .   .   m   y  sp   c   o   d   e  sp
0000040   h   e   r   e   .   .   .  cr  nl

它在寻找一个叫做 "/usr/bin/python\r" 的可执行文件,但找不到,所以就报错了,提示 "没有这样的文件或目录"

今天我又遇到了这个问题,所以我决定在这里记录一下。

4

你的问题很可能是因为在从属机器上(也就是运行TaskTracker的地方)找不到Python可执行文件。Java也会给出同样的错误信息。

你需要在所有使用到的地方都安装Python。在你的文件中,你可以像你可能已经做的那样使用shebang(就是文件开头的那一行):

#!/usr/bin/python -O
rest
of
the
code

确保shebang后面的路径和TaskTracker上安装Python的路径是一样的。

8

在查看HadoopStreaming的维基页面上的例子时,似乎你应该把

-mapper scripts/mapper.py 
-file scripts/mapper.py 

改成

-mapper mapper.py 
-file scripts/mapper.py 

因为“发送的文件会放到工作目录里”。你可能还需要直接指定Python解释器:

-mapper /path/to/python mapper.py 
-file scripts/mapper.py 

撰写回答