我正在尝试运行 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链接,但这也不起作用!关于如何修复这个错误有什么想法吗?.
查看 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
您的问题很可能是从站(运行 TaskTracker 的地方)上不存在 python 可执行文件。 Java也会给出同样的错误信息。
将其安装在任何使用的地方。在您的文件中,您可以使用 shebang,就像您可能已经做的那样:
#!/usr/bin/python -O
rest
of
the
code
确保 shebang 之后的路径与 TaskTrackers 上安装 python 的路径相同。
还有一个偷偷摸摸的事情可能会导致这种情况。如果脚本上的行结尾是 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 上的某个地方。
import sys
sys.path.append('.')
这将使 python 查找当前工作目录,然后它应该能够运行,同时确保你的 shebang 是正确的。
命令如下:
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
chmod a+x scripts/mapper.py
Hadoop 在写入/读取 std 之前分叉并运行脚本,因此您需要授予它执行权限才能运行。
try:
# Skip over any errors
word = words[18].strip()
if (len(word) == 0):
word = "UKNOWN"
print '%s\t%s' % (word, 1)
except Value:
pass
知道这一点,我解决了这样的问题,当你在流媒体上遇到问题(没有java)时,我建议你遵循这个检查清单:
python myScript.py
使其在启动时可执行,因为
./myScript.py
这是流媒体调用脚本的方式。
-verbose
查看 jar 中将要部署到容器中的内容,有时这会有所帮助。
-file
移动的文件不在文件夹中。
-mapper folder/script.py
或
-reducer folder/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)
最终从 /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/古腾堡输出