2013-02-19 25 views
4

我的大學運行一個condor計算網格(計算節點正在運行Linux),並且我想用它來在R中運行模擬。問題是隻有部分機器啓動電網安裝了R。到目前爲止,我看到兩個選項,但我不知道如何實現其中一個,因此我希望你能幫助我(請記住,我不是系統管理員,也不能做太多改變計算節點):Condor的Sandboxing R(在Linux上)

1)檢查與我的神鷹提交文件一起出去的ClassAds,要求在具有/usr/bin/R的節點上計算作業。

2)R組和所有的依賴成可以被髮送到計算節點,並針對其我的模擬可以運行一個獨立的目錄。我已經嘗試了幾個小時來做​​到這一點,但R的Linux版本(與OSX和Windows版本不同)似乎針對分佈在整個文件系統中的庫運行,我想不出一種實際的方法來收集它們都進入了R可以找到它們的位置。

任何想法? 在此先感謝。

+0

對於2,https://github.com/viking/Renv可能會有所幫助 – hadley 2013-02-19 17:15:43

+0

[鼠尾草(http://www.sagemath.org/)束R(以及許多其他)獨立的時尚。也許你可以看看他們做到了。在很多情況下,將'LD_LIBRARY_PATH'導出到庫所在的目錄就足夠了。 – MvG 2013-02-19 18:25:46

+0

謝謝,你們倆。 @MvG:我沒有意識到sage捆綁R--也許我可以通過將聖人發送到計算節點來利用它。 – Wesley 2013-02-19 18:59:57

回答

1

最終爲我工作的是什麼解決方案(1)。在這裏,我將討論我如何在我的condor提交文件和我的worker shell腳本中實現(1)。

這裏是shell腳本。重要的變化是通過:if [ -f /usr/bin/R ]來檢查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))。它檢查來自計算節點的每個作業的返回值 - 如果返回值不爲零(即,如果在計算節點上未找到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

哇,好的,這比我想的要難。我們從建議的解決方案(2)開始:

在哈德利的建議下,我使用Renv將R安裝到已知的本地目錄(也使用R-build構建R-2.15.2)。不幸的是,這個本地安裝仍然依賴於像/usr/lib這樣的位置的系統級庫。

MvG建議將本地R安裝從sage中取出。這個包裝包含所有必要系統庫的本地副本,並且可能適用於大多數面對我情況的人。但是,我的R代碼依賴於僅與R> = 2.15兼容的幾個R程序包。

所以我把所有的庫從lib目錄聖人和複製他們入R-2.15.2從Renv安裝。這可能會奏效,但是我的大學神鷹網格上的一些機器必須有一個奇怪的架構,因爲大約有十分之一的工作回來了,並且出現了與嘗試使用錯誤版本libc.so有關的錯誤。此時,我放棄了提出的解決方案(2)並轉向提出的解決方案(1)。

+0

你可以使用install.packages(lib.loc =)和library(lib.loc =)強制安裝/從特定目錄加載軟件包 – RockScience 2013-09-07 17:15:41