我已经建立了一个基本的hadoop主从集群设置,并且能够在集群上运行mapreduce程序(包括python)。
现在我正在尝试运行一个访问C二进制文件的python代码,所以我使用的是子进程模块。我能够将hadoop流用于普通的python代码,但是当我包含子进程模块来访问二进制文件时,作业就会失败。
正如您在下面的日志中所看到的,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运行可执行文件或帮助调试的任何帮助都会让我向前推进。
谢谢,
内甚
答案 0 :(得分:0)
映射器是否被复制到实例?尝试使用--alive
标志进行交互式会话以对此进行测试。您可以使用引导操作将文件复制到实例,然后使用chmod将它们作为可执行文件。
答案 1 :(得分:0)
它可能是hello的执行权限问题。您还需要使用标准输入。
如果您从作业输出中查看跟踪器URL,可以单击失败的映射器并查看可能包含一些多汁python异常的stderr。
答案 2 :(得分:0)
将-file /home/hduser/MARS.py添加到您的命令并将c可执行文件复制到hdfs。