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链接,不工作过!有关如何解决这个错误的任何想法?

+0

你解决这个问题?我在Windows Server 2012上面临同样的问题。 – 2016-01-14 10:35:33

望着在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 
+0

感谢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

+0

我有一个工作脚本,它具有-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所以你需要给它执行的许可才能运行。

+0

是的,它有。我在帖子中提到它拥有所有权限。 – vkris 2010-12-04 01:52:18

+1

也许你应该去任一个任务跟踪器节点,并尝试运行cat somedata.csv | ./mapper。你可能会发现数据节点有异常的错误。还有脚本目录是bin和contrib的兄弟吗? – 2010-12-04 02:04:28

+0

我正尝试以伪分布式模式运行。我曾尝试使用实际的群集运行,但仍出现同样的问题。所以运行cat inputfile | ./mapper.py的作品! 是的,脚本目录是bin,contrib的兄弟。 – vkris 2010-12-06 17:11:31

我刚收到同样的错误,当我的映射器返回一个空或空字符串。因此,我不得不为价值做了检查:

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)面向:

  1. 是否脚本运行?不要开始使用解释器,即 python myScript.py使它在启动时可执行,如./myScript.py这是流将调用脚本的方式。
  2. 使用-verbose来查看将要部署到容器中的jar文件的内容,有时候会提供帮助。
  3. 容器脚本里面的符号链接不是真正的文件。
  4. 使用-file移动的文件不在文件夹中。 -mapper folder/script.py-reducer folder/script.py被视为script.py
  5. 如果要查看容器中发生的事情,将容器及其内部的任何内容都删除后,将其移入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