Hadoop Streaming - 找不到文件错误
我正在尝试运行一个使用 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