2016-09-01 1 views
2

패키지 R 바이너리 및 라이브러리 (설치없이)를 사용하여 AWS EC2 인스턴스의 명령 줄에서 R 스크립트를 실행하려고합니다. AWS Lambda에 배치. 나는 these instructions을 따라 갔다. 지시 사항은 모든 R 바이너리와 라이브러리를 zip 파일로 패키징하고 테스트를 위해 모든 것을 Amazon EC2 인스턴스로 이동하는 것입니다. 나는 새 컴퓨터에있는 모든 압축을 푼 컴퓨터에 'sudo는 냠 업데이 트를'실행, 적절한 위치를 가리 키도록 R의 환경 변수를 설정 :Rscript가 AWS Lambda 용 패키지 R과 함께 작동하지 않습니다.

export R_HOME=$HOME 
export LD_LIBRARY_PATH=$HOME/lib 

참고 : $ 홈입니다/홈/EC2 사용자에게 동일한 .

나는 시험이 hello_world.R 파일 생성 :

#!/home/ec2-user/bin/Rscript 
print ("Hello World!") 

을하지만 실행할 때이 :

ec2-user$ Rscript hello_world.R 

나는 다음과 같은 오류 있어요 :

Rscript execution error: No such file or directory 

그래서 내가 확인을 경로는 있지만 모두 체크 아웃 :

ec2-user$ whereis Rscript 
    Rscript: /home/ec2-user/bin/Rscript 

ec2-user$ whereis R 
    R: /home/ec2-user/bin/R /home/ec2-user/R 

하지만 명령 줄에서 RSCRIPT를 사용하여 식을 평가하려고 할 때, 나는이있어 :

ec2-user$ Rscript -e "" --verbose 
    running 
    '/usr/lib64/R/bin/R --slave --no-restore -e ' 

    Rscript execution error: No such file or directory 

RSCRIPT 여전히 기본 위치 '는/usr/lib64에/R에서 R을 찾고있는 것 같다/가정/EC2 사용자 ''내 R_HOME 변수로 설정하더라도 '/ 빈/R은 :

ec2-user$ echo $R_HOME 
    /home/ec2-user 

나는 지원의 뿌리를 발견했습니다,하지만 난 내 특정 문제를 해결 아무것도 찾을 수 없습니다. 어떤 사람들은 R을 재설치 할 것을 제안했지만, Lambda의 목적을 위해, 모든 것을 자체적으로 포함 할 필요가있어서 별도의 EC2 인스턴스에 R을 설치 한 다음 그것을 패키지로 만들었습니다. R이 패키지 관리자와 함께 설치된 컴퓨터에서 모든 것이 제대로 실행된다고 언급해야합니다.

해결 방법 : 답변에 내 solution을 게시했습니다.

답변

2

는 바로 당신을 쳐다보고 thinkt : 당신은 R을 어디에 두

ec2-user$ whereis R 
    R: /home/ec2-user/bin/R /home/ec2-user/R 

입니다 - 그러나 그것은을 위해 지어진/예상이 :

ec2-user$ Rscript -e "" --verbose 
    running 
    '/usr/lib64/R/bin/R --slave --no-restore -e ' 

이러한 경로가 동일하지 . 실제 오류는 사용자가 R 설치 을 빌드하고 구성한 다음 다른 디렉토리으로 재배치 할 수 있다는 가정하에 작성되었습니다. 당신은 할 수 없습니다.

새로운 (알려진) 경로에 대해 R을 빌드하고 설치할 수 있습니다. (가)에 대한 구성 및 설치-에서 경로 동일하며, 모두가 좋은 시스템에 :

$ Rscript -e "q()" --verbose 
running 
    '/usr/lib/R/bin/R --slave --no-restore -e q()' 

$ 
+0

감사합니다. 예, 문제의 근원 인 것 같았지만 문제를 해결하는 방법을 알지 못했습니다. 이 솔루션의 일부를 따라갔습니다. http://fumodibit.blogspot.co.uk/2013/04/modifying-r-to-obtain-relocatable.html?showComment=1436450064627 –

2

This blog 포스트는 비슷한 문제를 통해 안내하고 잠재적 인 솔루션을 제공합니다. 또한 this post에서 솔루션의 일부를 구현해야했습니다.이에

#!/bin/sh 
# Shell wrapper for R executable. 

R_HOME_DIR=${R_ROOT_DIR}/lib64${R_ROOT_DIR} 

:

R_HOME_DIR=${RHOME}/lib64${R_ROOT_DIR} 

나는 이유는 아래에 설명 할 것이다

나는이에서 R의 소스 코드의 첫 번째 라인을 변경했습니다.

주 - 코드의 나머지 부분은 다음과 같습니다

if test "${R_HOME_DIR}" = "${R_ROOT_DIR}/lib64${R_ROOT_DIR}"; then 
    case "linux-gnu" in 
    linux*) 
    run_arch=`uname -m` 
    case "$run_arch" in 
     x86_64|mips64|ppc64|powerpc64|sparc64|s390x) 
      libnn=lib64 
      libnn_fallback=lib 
     ;; 
     *) 
      libnn=lib 
      libnn_fallback=lib64 
     ;; 
    esac 
    if [ -x "${R_ROOT_DIR}/${libnn}${R_ROOT_DIR}/bin/exec${R_ROOT_DIR}" ]; then 
     R_HOME_DIR="${R_ROOT_DIR}/${libnn}${R_ROOT_DIR}" 
    elif [ -x "${R_ROOT_DIR}/${libnn_fallback}${R_ROOT_DIR}/bin/exec${R_ROOT_DIR}" ]; then 
     R_HOME_DIR="${R_ROOT_DIR}/${libnn_fallback}${R_ROOT_DIR}" 
    ## else -- leave alone (might be a sub-arch) 
    fi 
    ;; 
    esac 
fi 

if test -n "${R_HOME}" && \ 
    test "${R_HOME}" != "${R_HOME_DIR}"; then 
    echo "WARNING: ignoring environment value of R_HOME" 
fi 
R_HOME="${R_HOME_DIR}" 
export R_HOME 

당신은 하단에 볼 수있는이 코드 세트는 원래 R_ROOT_DIR에 따라 할당 R_HOME_DIR에 동일한 R_HOME.

R_HOME_DIR 또는 R_HOME 변수를 아무리 설정해도 R은 R_ROOT_DIR 변수를 사용하여 모든 것을 다시 설정합니다.

는 변경으로 내 모든 환경 변수를 설정할 수 있습니다
export RHOME=$PWD/R #/home/ec2-user/R 
export R_HOME=$PWD/R #/home/ec2-user/R 
export R_ROOT_DIR=/R #/R 

본인은 R 패키지 앉아 내 작업 디렉토리에 RHOME을 설정합니다. RHOME은 기본적으로 접두사 역할을하지만, 내 경우에는/home/ec2-user /입니다.

또한, RSCRIPT 명령 행에 ... RHOME 무엇이든에/R/빈, 그래서 지금은 제대로 실행할 수 있습니다 ...

Rscript hello_world.R 

을 추가합니다. Rscript는 R을 어디에서 찾을 수 있는지 알고 있습니다. R은 모든 것을 찾을 수있는 위치를 알고 있습니다.

Docker 등을 사용하지 않고 휴대용 독립 실행 형 폴더에서 R을 패키징하는 것이 좋을 것입니다. 누구보다 더 쉽게이 작업을 수행 할 수 있다면 정말 고맙겠습니다.