【问题标题】:Shell script not running R (Rhipe) program from Java codeShell 脚本未从 Java 代码运行 R (Rhipe) 程序
【发布时间】:2012-02-19 07:48:35
【问题描述】:

我有一个简单的 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 的结果。

请帮忙!

【问题讨论】:

  • 你遇到了什么错误?
  • 我没有收到任何错误。 myMRjob.R 没有被执行。我在点击返回后的下一瞬间看到终端提示。该作业需要一些时间来运行并将 o/p 写入 hdfs。我还检查了 hdfs 中没有创建 o/p 目录。
  • @dipeshtech:使用 proc.getErrorStream() 将错误输入到输入流中。在控制台打印出来....应该有错误sumwer
  • 尝试stackoverflow.com/a/8963445/525978打印错误并输出
  • 感谢 Shashank,我没有收到任何错误,但是通过添加这些行,事情开始起作用了。

标签: java r shell unix


【解决方案1】:

您的 shell 脚本没有从 exec 调用运行的原因是 shell 脚本实际上只是文本文件,它们不是本机可执行文件。知道如何解释它们的是 shell (Bash)。 exec 调用期望找到本机可执行二进制文件。

像这样调整你的 Java 以便调用 shell 并让它运行你的脚本:

proc = Runtime.getRuntime().exec("/bin/bash Recomm.sh", null, wd);

当您直接从 Java 调用 hadoop 时,它是一个本机可执行文件,这就是它起作用的原因。

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 2014-11-20
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多