Hadoop流 - 无法找到文件错误
我想运行一个hadoop流python作业。Hadoop流 - 无法找到文件错误
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链接,不工作过!有关如何解决这个错误的任何想法?
望着在HadoopStreaming wiki page的例子,看来你应该改变
-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
感谢Brad,但错误更改为 /System/Library/Frameworks/Python.framework/Versions/2.5/Resources/Python.app/Contents/MacOS/Python:can not打开文件'mapper.py':[Errno 2]没有这样的文件或目录 java.lang.RuntimeException:PipeMapRed.waitOutputThreads():子进程失败,代码为2 – vkris 2010-12-03 14:00:28
我有一个工作脚本,它具有-file ../scripts/ mapper.py -mapper ../scripts/mapper.py – Brig 2010-12-10 21:02:31
您的mapper.py是否对其执行权限?如果没有,那么你需要它。
chmod a+x scripts/mapper.py
Hadoop的叉子和运行写入之前的脚本/读取到std所以你需要给它执行的许可才能运行。
我刚收到同样的错误,当我的映射器返回一个空或空字符串。因此,我不得不为价值做了检查:
try:
# Skip over any errors
word = words[18].strip()
if (len(word) == 0):
word = "UKNOWN"
print '%s\t%s' % (word, 1)
except Value:
pass
您的问题,最有可能的是,蟒蛇执行上不存在奴隶(其中的TaskTracker正在运行)。 Java会给出相同的错误信息。
将它安装在使用它的地方。取消你的文件,你可以使用家当或许你已经这样做:
#!/usr/bin/python -O
rest
of
the
code
确保家当后的路径是Python是安装在的TaskTracker相同。
我在CDH4 Hadoop集群上遇到完全相同的问题,试图运行流python作业。关键是要在你的映射器/减速文件添加为第一行:
import sys
sys.path.append('.')
这将使得在当前的工作目录蟒的样子,然后它应该可以运行,也确保你的家当是正确的。
另一个偷偷摸摸的事情可能会导致这种情况。如果脚本的行结束是DOS的风格,那么你的第一行(“认领线”)可能看起来像这样肉眼:
#!/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"
可执行文件,它无法找到,因此它与"No such file or directory"
死亡。
今天这个位,再,所以我不得不把它写在SO上的某个地方。
文件未找到错误有时并不意味着“未找到文件”,而是表示“无法执行此脚本”。
认识到这一点我解决了这样的问题,当你与流媒体,我建议您按照检查表的问题(没有Java)面向:
- 是否脚本运行?不要开始使用解释器,即
python myScript.py
使它在启动时可执行,如./myScript.py
这是流将调用脚本的方式。 - 使用
-verbose
来查看将要部署到容器中的jar文件的内容,有时候会提供帮助。 - 容器脚本里面的符号链接不是真正的文件。
- 使用
-file
移动的文件不在文件夹中。-mapper folder/script.py
或-reducer folder/script.py
被视为script.py
- 如果要查看容器中发生的事情,将容器及其内部的任何内容都删除后,将其移入HDFS,IE:使用.sh替换映射器或reducer做这项工作的脚本。
这个清单帮了我很多,希望对你也有用。
下面是带有模糊错误消息的经典日志。
确实如此,它无法运行程序。
Caused by: java.io.IOException: Cannot run program "/hadoop/yarn/local/usercache/root/appcache/application_1475243242823_0007/container_1475243242823_0007_01_000004/./reducer.py":
error=2, No such file or directory
这是谎言的原因。
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
at org.apache.hadoop.streaming.PipeMapRed.configure(PipeMapRed.java:209)
... 15 more
阅读:
Caused by: java.io.IOException: error=2, No such file or directory
这是一个谎言,不存在的文件,如果-verbose显示它到包装清单。
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:187)
at java.lang.ProcessImpl.start(ProcessImpl.java:130)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
我在使用python代码运行map reduce时遇到了同样的问题。 解决方法是:我们必须在mapper和reducer前面指定“-file”。
下面是一个命令:
hadoop jar /opt/cloudera/parcels/CDH-5.12.2-1.cdh5.12.2.p0.4/lib/hadoop-mapreduce/hadoop-streaming-2.6.0-cdh5.12.2.jar **-file /home/mapper.py** -mapper /home/mapper.py **-file /home/reducer.py** -reducer /home/reducer.py -input /system/mainstream/tmp/file.txt -output /system/mainstream/tmp/output
你解决这个问题?我在Windows Server 2012上面临同样的问题。 – 2016-01-14 10:35:33