我有一个简单的 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 的结果。
请帮忙!
最佳答案
您的 shell 脚本未从 exec 调用运行的原因是因为 shell 脚本实际上只是文本文件,它们不是 native 可执行文件。 shell (Bash) 知道如何解释它们。 exec 调用期望找到 native 可执行二进制文件。
像这样调整你的 Java 以便调用 shell 并让它运行你的脚本:
proc = Runtime.getRuntime().exec("/bin/bash Recomm.sh", null, wd);
当您直接从 Java 调用 hadoop 时,它是一个 native 可执行文件,这就是它工作的原因。
关于java - Shell 脚本未从 Java 代码运行 R (Rhipe) 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9347602/