1

我已经建立了一个基本的 hadoop 主从集群设置,并且能够在集群上运行 mapreduce 程序(包括 python)。

现在我正在尝试运行一个访问 C 二进制文件的 python 代码,所以我正在使用 subprocess 模块。我可以将 hadoop 流用于普通的 python 代码,但是当我包含 subprocess 模块来访问二进制文件时,作业失败了。

正如您在下面的日志中看到的,hello 可执行文件被识别为用于打包,但仍然无法运行代码。

. . packageJobJar: [ /tmp/hello/hello , /app/hadoop/tmp/hadoop-unjar5030080067721998885/] [] /tmp/streamjob7446402517274720868.jar tmpDir=null

JarBuilder.addNamedStream hello
.
.
12/03/07 22:31:32 INFO mapred.FileInputFormat: Total input paths to process : 1
12/03/07 22:31:32 INFO streaming.StreamJob: getLocalDirs(): [/app/hadoop/tmp/mapred/local]
12/03/07 22:31:32 INFO streaming.StreamJob: Running job: job_201203062329_0057
12/03/07 22:31:32 INFO streaming.StreamJob: To kill this job, run:
12/03/07 22:31:32 INFO streaming.StreamJob: /usr/local/hadoop/bin/../bin/hadoop job  -Dmapred.job.tracker=master:54311 -kill job_201203062329_0057
12/03/07 22:31:32 INFO streaming.StreamJob: Tracking URL: http://master:50030/jobdetails.jsp?jobid=job_201203062329_0057
12/03/07 22:31:33 INFO streaming.StreamJob:  map 0%  reduce 0%
12/03/07 22:32:05 INFO streaming.StreamJob:  map 100%  reduce 100%
12/03/07 22:32:05 INFO streaming.StreamJob: To kill this job, run:
12/03/07 22:32:05 INFO streaming.StreamJob: /usr/local/hadoop/bin/../bin/hadoop job  -Dmapred.job.tracker=master:54311 -kill job_201203062329_0057

12/03/07 22:32:05 INFO streaming.StreamJob: Tracking URL: http://master:50030/jobdetails.jsp?jobid=job_201203062329_0057
12/03/07 22:32:05 ERROR streaming.StreamJob: Job not Successful!

12/03/07 22:32:05 INFO streaming.StreamJob: killJob...
Streaming Job Failed!

我正在尝试的命令是:

hadoop jar contrib/streaming/hadoop-*streaming*.jar -mapper /home/hduser/MARS.py -reducer /home/hduser/MARS_red.py -input /user/hduser/mars_inputt -output /user/hduser/mars-output -file /tmp/hello/hello -verbose

其中 hello 是 C 可执行文件。这是一个简单的 helloworld 程序,我用它来检查基本功能。

我的 Python 代码是:

#!/usr/bin/env python
import subprocess
subprocess.call(["./hello"])

任何有关如何在 hadoop 流中使用 Python 运行可执行文件或帮助调试的帮助都会让我在这方面取得进展。

谢谢,

加内什

4

3 回答 3

0

映射器是否被复制到实例中?--alive尝试使用标志进行交互式会话来测试这一点。您可以使用引导操作将文件复制到实例,然后使用 chmod 使它们成为可执行文件。

于 2012-11-18T16:35:31.233 回答
0

这可能是 hello 的执行权限问题。您还需要使用标准输入。

如果您查看作业输出中的跟踪器 url,您可以单击失败的映射器并查看可能包含一些多汁 python 异常的 stderr。

于 2014-02-13T12:43:28.583 回答
0

将 -file /home/hduser/MARS.py 添加到您的命令中,并将 c 可执行文件复制到 hdfs。

于 2014-08-25T16:17:01.360 回答