2013-07-11 1 views
1

저는 R-Hadoop을 사용하는 프로젝트에서이 문제를 겪고 있습니다.라이브러리 "rhdfs"를로드하는 R 스크립트를 원격으로 실행하지 못했습니다.

Java에서 JSch를 사용하여 원격 hadoop 의사 클러스터에 ssh를 보내고 여기에 연결을 작성하는 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")'을 실행하면 모든 것이 잘 동작합니다. 나는 오류

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에서

다음있어 : 나는 다음 명령을 사용 대신 RSCRIPT를 사용하여 : 여기

내가 홍콩 오오이의 제안을 복용 후 가지고 무엇

> 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 

이제는 문제가 훨씬 명확 해졌습니다. 불행히도, 나는 리눅스에 익숙하지 않고 이것을 어떻게 해결해야할지 모른다.

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"); 

문제는 환경에 의해 발생되었다

+0

어떤 오류 메시지 (들)을 RHadoop을 사용 하시겠습니까? Java 또는 R 오류입니까? –

+0

@HongOoi R 스크립트는 원격 서버의 백그라운드에서 자동으로 실행되므로 원격 서버의 명령 줄 사용자 인터페이스는 변경되지 않으므로 원격 서버에서 정확히 어떤 일이 발생했는지 알 수 없습니다. R 스크립트에 cat ("blabla")를 추가하더라도 원격 서버에 인쇄 된 정보는 얻지 못합니다. 그래서 나는 "xxx function inside"와 같은 이름으로 txt 파일을 생성하는 까다로운 방법을 사용하여 "라이브러리"("무엇이든지")를 실행하려고 할 때마다 스크립트가 얼마나 멀리 있는지 확인합니다. " –

+0

'sink '를 사용하여 출력을 파일로 재 지정하십시오. 그것은 당신이 무슨 일이 일어나고 있는지 진단하는 데 도움이 될 수 있습니다. –

답변

2

글쎄, 나는 또 다른 나 자신에 의해 해결책을 발견 :

대신 하둡 클러스터 외부에서 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

음,이 같은이 문제를 해결했다. 원격 Hadoop 클러스터에 대한 SSH는 실제로 다른 환경을 사용하므로 $ HADOOP_CMD와 같은 변수는 발견되지 않습니다. SSH 세션이 환경 변수를 선택하는 f}을 알리는 f}은 여러 가지가 있습니다.

제 방법에서는 "source /etc/profile"이 sshed 환경에 환경을 어디에서 찾을 수 있는지 알려줍니다.

관련 문제