我有一个简单的shell脚本,如下所示:
R --vanilla<myMRjob.R
hadoop fs -get /output_03/ /home/user/Desktop/hdfs_output/
此shell脚本运行myMRjob.R,并将hdfs的输出获取到本地文件系统。它从终端执行良好。
当我尝试从java代码运行shell脚本时,我无法启动MapReduce作业,即第一行未执行。虽然“hadoop fs -get ..”行通过Java代码正常运行。
我使用的Java代码是:
import java.io.*;
public class Dtry {
public static void main(String[] args) {
File wd = new File("/home/dipesh/");
System.out.println("Working Directory: " +wd);
Process proc = null;
try {
proc = Runtime.getRuntime().exec("./Recomm.sh", null, wd);
} catch (Exception e) {
e.printStackTrace();
}
}
}
整个练习背后的原因是我想在JSP中触发并显示myMRjob.R的结果。
请帮忙!
答案 0 :(得分:0)
你的shell脚本没有从exec调用运行的原因是因为shell脚本实际上只是文本文件而且它们不是本机可执行文件。 shell(Bash)知道如何解释它们。 exec调用期望找到本机可执行二进制文件。
调整你的Java,以便调用shell并让它运行你的脚本:
proc = Runtime.getRuntime().exec("/bin/bash Recomm.sh", null, wd);
当您直接从Java调用hadoop时,它是一个本机可执行文件,这就是它工作的原因。