2013-07-11 72 views
1

我正在使用R-Hadoop的項目,並得到了這個問題。無法遠程執行R腳本加載庫「rhdfs」

我在JAVA中使用JSch將ssh轉換爲遠程hadoop僞集羣,這裏是創建連接的Java代碼的一部分。

/* Create a connection instance */ 
Connection conn = new Connection(hostname); 
/* Now connect */ 
conn.connect(); 
/* Authenticate */ 
boolean isAuthenticated = conn.authenticateWithPassword(username, password); 
if (isAuthenticated == false) 
throw new IOException("Authentication failed."); 
/* Create a session */ 
Session sess = conn.openSession(); 
//sess.execCommand("uname -a && date && uptime && who"); 
sess.execCommand("Rscript -e 'args1 <- \"Dell\"; args2 <- 1; source(\"/usr/local/R/mytest.R\")'"); 
//sess.execCommand("ls"); 
sess.waitForCondition(ChannelCondition.TIMEOUT, 50); 

我試了幾個簡單的R腳本,我的代碼工作正常。但是當談到R-Hadoop時,R腳本將停止運行。但如果我直接在遠程服務器上運行Rscript -e 'args1 <- "Dell"; args2 <- 1; source("/usr/local/R/mytest.R")',一切正常。

這是我服用香港大井的建議後得到: 而不是使用RSCRIPT,我用下面的命令:

sess.execCommand("R CMD BATCH --no-save --no-restore '--args args1=\"Dell\" args2=1' /usr/local/R/mytest.R /usr/local/R/whathappened.txt"); 

而在whathappened.txt,我得到了以下錯誤:

> args=(commandArgs(TRUE)) 
> for(i in 1:length(args)){ 
+  eval(parse(text=args[[i]])) 
+ } 
> source("/usr/local/R/main.R") 
> main(args1,args2) 
Loading required package: rJava 
Error : .onLoad failed in loadNamespace() for 'rhdfs', details: 
    call: fun(libname, pkgname) 
    error: Environment variable HADOOP_CMD must be set before loading package rhdfs 
Error: package/namespace load failed for 鈥榬hdfs鈥? 
Execution halted 

那麼,現在的問題是更清晰。不幸的是,我對Linux很新,也不知道如何解決這個問題。

+0

什麼錯誤消息(S)你用RHadoop獲得?他們是Java還是R錯誤? –

+0

@HongOoi R腳本會自動運行在遠程服務器的後臺,這意味着遠程服務器的命令行用戶界面保持不變,因此我甚至不知道遠程服務器發生了什麼。即使我將貓(「blabla」)添加到R腳本中,我也不會在遠程服務器上獲得任何打印的信息。所以我使用了一個棘手的方法,生成名稱爲「Inside xxx function」的txt文件,以查看腳本的行進距離,結果每次嘗試執行「library(」any「)時都會停止。」 –

+0

您可以使用'sink'將輸出重定向到一個文件。這可能有助於您診斷正在發生的事情。 –

回答

2

好吧,我只是發現自己的另一種解決方案:

而不是從Hadoop集羣外關心ENV,在R中可以腳本等設定的ENV:

Sys.setenv(HADOOP_HOME="put your HADOOP_HOME path here") 
Sys.setenv(HADOOP_CMD="put your HADOOP_CMD path here") 

library(rmr2) 
library(rhdfs) 
2

好吧,我解決了這個問題是這樣的:

sess.execCommand("source /etc/profile; R CMD BATCH --no-save --no-restore '--args args1=\"Dell\" args2=1' /usr/local/R/mytest.R /usr/local/R/whathappened.txt"); 

問題是由環境造成的。 SSH到遠程Hadoop集羣實際上使用不同的環境,因此不會發現像$ HADOOP_CMD這樣的變量。有多種方式讓SSH會話知道如何選擇環境變量。

在我的方法中,"source /etc/profile"可以告訴在哪裏找到環境惡意。