Python Hadoop流媒体-找不到文件错误
我正在尝试运行hadoop流式python作业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=
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
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