저는 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");
문제는 환경에 의해 발생되었다
어떤 오류 메시지 (들)을 RHadoop을 사용 하시겠습니까? Java 또는 R 오류입니까? –
@HongOoi R 스크립트는 원격 서버의 백그라운드에서 자동으로 실행되므로 원격 서버의 명령 줄 사용자 인터페이스는 변경되지 않으므로 원격 서버에서 정확히 어떤 일이 발생했는지 알 수 없습니다. R 스크립트에 cat ("blabla")를 추가하더라도 원격 서버에 인쇄 된 정보는 얻지 못합니다. 그래서 나는 "xxx function inside"와 같은 이름으로 txt 파일을 생성하는 까다로운 방법을 사용하여 "라이브러리"("무엇이든지")를 실행하려고 할 때마다 스크립트가 얼마나 멀리 있는지 확인합니다. " –
'sink '를 사용하여 출력을 파일로 재 지정하십시오. 그것은 당신이 무슨 일이 일어나고 있는지 진단하는 데 도움이 될 수 있습니다. –