我的大学运行一个condor计算网格(计算节点运行Linux),我想用它在R中运行模拟。问题是网格上只有一些机器安装了R。到目前为止,我看到了两个选项,但我不知道如何实现这两个选项,所以我希望您能帮助我(请记住,我不是sysadmin,不能对计算节点的设置做太多更改):
1)检查与我的condor提交文件一起发出的ClassAds,以要求在具有/usr/bin/R的节点上计算作业。
2)将R及其所有依赖项打包到一个自包含的目录中,该目录可以发送到计算节点,并且可以针对该目录运行我的模拟。我已经尝试了几个小时来做到这一点,但是R的Linux版本(与OSX和Windows版本不同)似乎是针对分布在整个文件系统中的库运行的,我想不出一种实用的方法来将它们全部收集到R可以找到它们的位置。
有什么想法吗?提前谢谢。
发布于 2013-02-26 00:06:18
最终对我起作用的是提出的解决方案(1)。在这里,我将讨论如何在condor提交文件和worker shell脚本中实现(1)。
下面是shell脚本。重要的更改是通过if [ -f /usr/bin/R ]检查计算节点上是否安装了R。如果找到R,我们沿着一条以返回值0结束的路径前进。如果没有找到R,我们返回1(这就是行exit 0和exit 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现在,condor提交文件。关键的变化是倒数第二行(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发布于 2013-02-25 23:49:30
哇,好吧,这比我想象的要难。让我们从建议的解决方案开始(2):
在hadley的建议下,我使用Renv将R安装到一个已知的本地目录(也使用R-build构建R-2.15.2)。不幸的是,这个本地安装仍然依赖于来自/usr/lib等位置的系统范围的库。
MvG建议从sage中删除本地R安装。这个方法附带了所有必要系统库的本地副本,它可能适用于大多数遇到我这种情况的人。但是,我的R代码依赖于一些仅与R >= 2.15兼容的R包。
因此,我从sage的lib目录中获取了所有的库,并将它们复制到Renv的R-2.15.2安装中。这本来是可行的,但是我的大学的condor网格上的一些机器肯定有一个奇怪的架构,因为大约十分之一的作业返回时会出现与尝试使用错误版本的libc.so相关的错误。在这一点上,我放弃了提议的解决方案(2),转到提议的解决方案(1)。
https://stackoverflow.com/questions/14963107
复制相似问题