2012-02-19 104 views
1

我有一个简单的shell脚本,看起来像这样:shell脚本不是从Java代码运行R(Rhipe)计划

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

什么错误你好吗? – havexz 2012-02-19 07:54:57

+0

我没有收到任何错误。 myMRjob.R没有得到执行。在返回后我会在下一个瞬间看到终端提示。这项工作需要一段时间才能运行,并写入到hdfs的o/p。我还检查了在hdfs中没有创建o/p目录。 – dipeshtech 2012-02-19 08:04:27

+2

@dipeshtech:使用proc.getErrorStream()将错误获取到输入流中。打印它的控制台....应该有错误总和 – 2012-02-19 08:07:46

回答

0

你的shell脚本不从exec调用运行的原因是因为外壳脚本真的只是文本文件,它们不是本机的可执行文件。这是壳(Bash)知道如何解释它们。 exec调用期望找到一个本地可执行二进制文件。

调整您的Java这样才能调用shell并让它运行脚本:

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

当您直接从Java名为Hadoop的,它是一个可执行文件了,这就是为什么它的工作。