2013-02-19 4 views
4

내 대학에서는 condor 컴퓨팅 그리드 (계산 노드는 Linux를 실행 중입니다)를 실행하며 R에서 시뮬레이션을 실행하는 데 사용하고 싶습니다. 문제는 일부 컴퓨터에서만 그리드에는 R이 설치되어 있습니다. 지금까지 두 가지 옵션을 살펴 보았지만 두 가지 옵션 중 하나를 구현하는 방법을 모르겠습니다. 따라서 도움이 될 것입니다. (저는 sysadmin이 아니므로 설정을 변경하는 데 많은 시간을 할애 할 수는 없습니다. 노드를 계산) :Condor 용 Sandboxing R (Linux 용)

1) 내 condor 제출 파일로 나가는 ClassAds에 체크를 써서 /usr/bin/R 노드의 작업을 계산해야합니다.

2) R과 그 모든 종속성을 계산 노드로 보내고 시뮬레이션을 실행할 수있는 자체 포함 디렉토리에 패키지하십시오. 나는 이것을하기 위해 몇 시간 동안 노력했지만 Linux의 R 버전 (OSX 및 Windows 버전과 달리)은 파일 시스템 전반에 걸쳐 배포되는 라이브러리에 대해 실행되는 것으로 보이며이를 수집 할 실제 방법을 생각할 수 없다. 모든 것을 R이 찾을 수있는 위치에 놓습니다.

아이디어가 있으십니까? 미리 감사드립니다.

+0

2 들어 https://github.com/viking/Renv 도움이 될 수 – hadley

+0

[세이 (http://www.sagemath.org/)가 경로 생성에서 (많은 다른 사람들) R 번들 독립적 인 패션.아마도 당신은 그들이 그것을하는 것처럼 들여다 볼 수 있습니다. 대부분의 경우, 라이브러리가있는 디렉토리에'LD_LIBRARY_PATH'를 내보내는 것으로 충분할 것입니다. – MvG

+0

감사합니다, 여러분. @MvG : 나는 현자가 R을 묶는다는 것을 알지 못했습니다. 아마 계산 노드에 sage를 보냄으로써 그것을 활용할 수 있습니다. – Wesley

답변

1

나를 위해 결국 효과가있는 것이 해결책 (1)이었습니다. 여기에 내 condor 제출 파일 및 작업자 셸 스크립트에서 구현 한 방법 (1)에 대해 설명합니다.

다음은 쉘 스크립트입니다. 중요한 변화는 R이 계산 노드에 설치되어 있는지 확인하는 것입니다 : if [ -f /usr/bin/R ]. R이 발견되면 반환 값 0으로 끝나는 경로로 이동합니다. R이 없으면 1을 반환합니다 (라인 exit 0exit 1의 의미입니다).

mkdir output 
if [ -f /usr/bin/R ] 
then 
    if $(uname -m |grep '64') 
    then 
      Rscript code/simulations-x86_64.r $* 
    else 
      Rscript code/simulations-i386.r $* 
    fi 

    tar -zcvf output/output-$1-$2.tgz2 output/*.csv 
    exit 0 
else 
    exit 1 
fi 

이제 콘도 제출 파일. 결정적인 변화는 두 번째 - 마지막 줄 (on_exit_remove = (ExitBySignal == False) && (ExitCode == 0))이었습니다. 계산 노드에서 각 작업의 반환 값을 확인합니다. 반환 값이 0이 아닌 경우 (즉, 계산 노드에서 R을 찾지 못한 경우) 작업을 다시 실행하기 위해 대기열에 넣습니다. 그렇지 않으면 작업이 완료된 것으로 간주되어 대기열에서 제거됩니다.

universe = vanilla 
log = logs/log_$(Cluster)_$(Process).log 
error = logs/err_$(Cluster)_$(Process).err 
output = logs/out_$(Cluster)_$(Process).out 
executable = condor/worker.sh 
arguments = $(Cluster) $(Process) 
requirements = (Target.OpSys=="LINUX" && regexp("stat", Machine)) 
should_transfer_files = YES 
when_to_transfer_output = ON_EXIT_OR_EVICT 
transfer_input_files = code, R-libs, condor, seeds.csv 
transfer_output_files = output 
notification = Never 
on_exit_remove = (ExitBySignal == False) && (ExitCode == 0) 
queue 1800 
0

와우, 알았어, 내가 생각했던 것보다 더 힘들었다.

hadley의 제안에서 R을 알려진 로컬 디렉토리 (R-2.15.2를 빌드하기 위해 R-build 사용)에 설치하기 위해 Renv을 사용했습니다. 불행히도이 로컬 설치는 여전히 /usr/lib과 같은 위치의 시스템 전체 라이브러리에 의존합니다.

MvG는 로컬 R 설치를 sage에서 꺼내는 것이 좋습니다. 이 패키지는 필요한 모든 시스템 라이브러리의 로컬 복사본과 함께 제공되며, 아마도 내 상황에 직면하는 대부분의 사람들을 위해 작동 할 수있는 방법입니다. 그러나 내 R 코드는 R> = 2.15와 호환되는 몇 가지 R 패키지에 의존합니다.

그래서 모든 라이브러리를 sage의 lib 디렉토리에서 가져 와서 Renv에서 R-2.15.2 설치로 복사했습니다. 이것은 효과가 있었지만 내 대학의 콘도 격자에있는 일부 기계는 이상한 아키텍처를 가져야합니다. 약 10 개 작업 중 하나가 잘못된 버전 libc.so을 사용하는 것과 관련된 오류로 되돌아 왔기 때문입니다. 이 시점에서 제안 된 솔루션 (2)을 포기하고 제안 된 솔루션 (1)으로 이동했습니다.

+0

install.packages (lib.loc =) 및 library (lib.loc =)를 사용하여 패키지를 특정 디렉토리에서 강제로 설치 /로드 할 수 있습니다. – RockScience