Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Hadoop流媒体-找不到文件错误_Python_Streaming_Hadoop_Mapreduce - Fatal编程技术网

Python Hadoop流媒体-找不到文件错误

Python Hadoop流媒体-找不到文件错误,python,streaming,hadoop,mapreduce,Python,Streaming,Hadoop,Mapreduce,我正在尝试运行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=

我正在尝试运行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 链接,那也不行!有没有关于如何修复此错误的想法?

查看上的示例,似乎您应该进行更改

-mapper scripts/mapper.py 
-file scripts/mapper.py 

因为“已发送的文件转到工作目录”。您可能还需要直接指定python解释器:

-mapper /path/to/python mapper.py 
-file scripts/mapper.py 

您的mapper.py是否具有执行权限?如果不是,那么你需要它

chmod a+x scripts/mapper.py

Hadoop在将脚本写入/读取到std之前分叉并运行脚本,因此您需要授予它运行的execute权限

当我的映射程序返回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

您的问题很可能是从机(TaskTracker正在运行的位置)上不存在python可执行文件。Java将给出相同的错误消息

在使用它的任何地方安装它。在文件中,您可以使用shebang,因为您可能已经这样做了:

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

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

我在试图运行python流作业的CDH4 Hadoop集群上遇到了完全相同的问题。诀窍是在mapper/reducer文件中添加第一行:

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

这将使python在当前的工作目录中运行,并且应该能够运行,同时确保您的shebang是正确的。

另一个狡猾的事情可能会导致这种情况。如果脚本上的行尾是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”
的可执行文件,但找不到它,因此它会在
“没有这样的文件或目录”
的情况下死亡


今天又是这样,所以我不得不把它写在某处。

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

知道了这一点,我解决了这样的问题,当您面临流媒体问题(没有java)时,我建议您遵循以下检查列表:

  • 脚本是否运行?不要开始使用解释器,即。
    python myScript.py
    使其在启动时可执行为
    /myScript.py
    这是流媒体调用脚本的方式
  • 使用
    -verbose
    查看将部署到容器中的jar中的内容,本帮助提供了一些帮助
  • 容器中的脚本是符号链接而不是真实的文件
  • 使用
    -file
    移动的文件不在文件夹中
    -mapper文件夹/script.py
    -reducer文件夹/script.py
    被视为
    script.py
  • 作业完成后,容器和其中的任何内容都将被删除,如果您想查看容器中发生的情况,请将其移动到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)
    
    java.lang.UNIXProcess.forkAndExec(本机方法)上的
    
    位于java.lang.UNIXProcess(UNIXProcess.java:187)
    在java.lang.ProcessImpl.start(ProcessImpl.java:130)
    位于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
    

    谢谢Brad,但是错误更改为/System/Library/Frameworks/Python.framework/Versions/2.5/Resources/Python.app/Contents/MacOS/Python:无法打开文件“mapper.py”:[Errno 2]没有这样的文件或目录java.lang.RuntimeException:PipeMapRed.waitOutputThreads():子进程失败,代码为2I。我有一个工作脚本,其中包含-file../scripts/mapper.py-mapper../scripts/mapper.py是的。我在帖子中提到,它拥有所有权限。也许你应该去你的任务跟踪节点,试着运行cat somedata.csv |./mapper.py,你可能会发现数据节点有异常错误。脚本目录也是bin和contrib的同级目录吗?我正在尝试以伪分布式模式运行。我确实试过用一个实际的集群运行,但仍然存在同样的问题。所以运行cat inputfile |./mapper.py是可行的!!是的,脚本目录是bin的同级,contrib.ooh!我尝试使用输入数据,当我使用cat input.txt | python mapper.py时,它工作正常。我的测试数据也通过了cat | mapper.py | reducer.py测试。我还必须加上错误处理。我在这里发现了同样的想法:周末被这个问题缠住了。谢谢奥巴马谢谢,那是我的问题!对我有用的是
    #/usr/bin/env python
    。您解决了这个问题吗?我在Windows Server 2012上也面临同样的问题。
    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