Hadoop Streaming - 找不到文件错误

8
我正在尝试运行一个Hadoop流式处理的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链接,但仍然无法工作!有什么想法可以解决这个问题吗?


1
你解决了这个问题吗?我在Windows Server 2012上遇到了同样的问题。 - Htin Aung
8个回答

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 

谢谢Brad,但错误变成了/System/Library/Frameworks/Python.framework/Versions/2.5/Resources/Python.app/Contents/MacOS/Python:无法打开文件'mapper.py':[Errno 2]没有那个文件或目录 java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): 子进程返回代码2失败 - vkris
我有一个工作脚本,其中包含-file ../scripts/mapper.py和-mapper ../scripts/mapper.py。 - Brig

4
你的问题很可能是在从属节点(TaskTracker 运行的地方)上没有 Python 可执行文件。Java 会给出相同的错误信息。
请在使用的所有地方安装 Python。在你的文件中,你可以像以前一样使用 shebang:
#!/usr/bin/python -O
rest
of
the
code

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


谢谢,那正是我的问题!对我有用的是 #!/usr/bin/env python - Mark Rajcok

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"的错误。

今天我又遇到了这个问题,所以我必须在 Stack Overflow 上写下来。


发现在这里有相同的想法:http://stackoverflow.com/questions/20218521/hadoop-streaming-external-mapper-script-file-not-found - Jeevs
上周末被这个问题卡住了。谢谢奥巴马!:D - dave

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

1

我在一个CDH4 Hadoop集群上尝试运行Python流处理作业时遇到了完全相同的问题。诀窍是将您的mapper/reducer文件添加为第一行:

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

这将使Python查找当前工作目录,然后应该能够运行,还要确保您的shebang是正确的。

0

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

了解这一点后,我解决了像这样的问题,当您在流媒体上遇到问题(没有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 中,例如:用 .sh 脚本替换 mapper 或 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)

0

你的mapper.py文件是否有执行权限?如果没有,那么你需要赋予它执行权限。

chmod a+x scripts/mapper.py

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

是的,它有。我在帖子中提到它拥有所有权限。 - vkris
1
也许你应该去任务跟踪器节点之一,尝试运行cat somedata.csv | ./mapper.py,你可能会发现来自数据节点的异常错误。此外,scripts目录是否是bin和contrib的同级目录? - Joe Stein
我正在尝试以伪分布模式运行。我尝试使用实际集群运行,但仍然出现相同的问题。所以运行cat inputfile | ./mapper.py可以解决问题!是的,scripts目录是bin、contrib的同级目录。 - vkris

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

哦!我用我的输入数据尝试了一下,当我执行 cat input.txt | python mapper.py 时它是有效的。 - vkris
我的测试数据也通过了 cat | mapper.py | reducer.py 的测试。我还不得不添加错误处理。 - Brig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接