2012-02-19 108 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的,它是一個可執行文件了,這就是爲什麼它的工作。