Hadoop Streaming - 无法找到文件错误

问题描述 投票:0回答:9

我正在尝试运行 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链接,但这也不起作用!关于如何修复这个错误有什么想法吗?.

python streaming hadoop mapreduce
9个回答
8
投票

查看 HadoopStreaming wiki 页面上的示例,看来您应该更改

-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 

4
投票

您的问题很可能是从站(运行 TaskTracker 的地方)上不存在 python 可执行文件。 Java也会给出同样的错误信息。

将其安装在任何使用的地方。在您的文件中,您可以使用 shebang,就像您可能已经做的那样:

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

确保 shebang 之后的路径与 TaskTrackers 上安装 python 的路径相同。


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"
的可执行文件,但找不到该可执行文件,因此它会因
"No such file or directory"
而终止。

今天这件事再次刺痛了我,所以我不得不把它写在 SO 上的某个地方。


1
投票
我在尝试运行流式 python 作业的 CDH4 Hadoop 集群上遇到了完全相同的问题。诀窍是将您的映射器/减速器文件添加为第一行:

import sys sys.path.append('.')

这将使 python 查找当前工作目录,然后它应该能够运行,同时确保你的 shebang 是正确的。


1
投票
我在使用 python 代码运行 MapReduce 时遇到了同样的问题。 解决方案是:我们必须在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
    

0
投票
你的mapper.py有执行权限吗?如果没有,那么您需要它。

chmod a+x scripts/mapper.py

Hadoop 在写入/读取 std 之前分叉并运行脚本,因此您需要授予它执行权限才能运行。


0
投票
当我的映射器返回 null 或空字符串时,我刚刚收到相同的错误。所以我必须检查该值:

try: # Skip over any errors word = words[18].strip() if (len(word) == 0): word = "UKNOWN" print '%s\t%s' % (word, 1) except Value: pass
    

0
投票
文件未找到错误有时并不意味着“文件未找到”,而是意味着“无法执行此脚本”。

知道这一点,我解决了这样的问题,当你在流媒体上遇到问题(没有java)时,我建议你遵循这个检查清单:

    脚本是否运行?不要开始使用解释器,即
  1. python myScript.py
    使其在启动时可执行,因为
    ./myScript.py
    这是流媒体调用脚本的方式。
  2. 使用
  3. -verbose
     查看 jar 中将要部署到容器中的内容,有时这会有所帮助。
  4. 容器内的脚本是符号链接而不是真正的文件。
  5. 使用
  6. -file
     移动的文件不在文件夹中。 
    -mapper folder/script.py
    -reducer folder/script.py
     被视为 
    script.py
    
    
  7. 作业完成后,容器及其内部的任何内容都会被删除,如果您想查看容器中发生的情况,请将其移动到 HDFS 中,即:用完成工作的 .sh 脚本替换映射器或减速器。
这个清单对我帮助很大,希望对你也有用。

下面是带有模糊错误消息的经典日志。

确实如此,程序无法运行。

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)
    

0
投票
就我而言,问题是文件是 dos 格式。不得不使用dos2unix reducer.py

最终从 /usr/local/hadoop 或 $HADOOP_HOME 目录运行的命令是

bin/hadoop jar 共享/hadoop/tools/lib/hadoop-

streaming.jar -文件 /usr/bin/python3 $HADOOP_HOME/mapper.py -mapper $HADOOP_HOME/mapper.py
-文件 /usr/bin/python3 $HADOOP_HOME/reducer.py -reducer $HADOOP_HOME/reducer.py
-输入 /usr/hduser/古腾堡/* -输出 /usr/hduser/古腾堡输出

© www.soinside.com 2019 - 2024. All rights reserved.