无法远程执行加载库“rhdfs”的R脚本

时间:2013-07-11 01:57:41

标签: r remote-access remote-server jsch rhadoop

我正在使用R-Hadoop开发一个项目,并遇到了这个问题。

我在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")',一切正常。

以下是我在采取Hong Ooi的建议后所得到的: 我没有使用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很新,并且不知道如何解决这个问题。

2 个答案:

答案 0 :(得分: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"可以告诉sshed环境在哪里找到环境virables。

答案 1 :(得分:2)

好吧,我自己找到了另一个解决方案:

可以在R脚本中设置env,而不是关注来自Hadoop集群外的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)