用于Condor的Sandboxing R(在Linux上)

时间:2013-02-19 16:58:32

标签: linux r condor

我的大学运行了一个神鹰计算网格(计算节点正在运行Linux),我想用它在R中运行模拟。问题是网格上只有一些机器安装了R.到目前为止,我看到两个选项,但我不知道如何实施任何一个选项,所以我希望你能帮助我(请记住,我不是一个系统管理员,而且不能做很多事情来改变计算节点的设置):

1)检查与我的condor提交文件一起发出的ClassAd,以要求在具有/usr/bin/R的节点上计算作业。

2)将R及其所有依赖项打包到一个自包含的目录中,该目录可以发送到计算节点并可以运行我的模拟。我已经尝试了几个小时才能做到这一点,但Linux版本的R(不同于OSX和Windows版本)似乎是针对分布在文件系统中的库运行的,我无法想到实用的将它们全部收集到R可以找到它们的位置的方法。

有什么想法吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

最终为我工作的是解决方案(1)。在这里,我将讨论如何在我的condor提交文件和我的工作shell脚本中实现(1)。

这是shell脚本。重要的变化是检查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

现在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

答案 1 :(得分:0)

哇,好的,这比我想象的要难。让我们从提出的解决方案(2)开始:

根据hadley的建议,我使用Renv将R安装到已知的本地目录(也使用R-build来构建R-2.15.2)。遗憾的是,此本地安装仍依赖于/usr/lib等位置的系统范围库。

MvG建议将本地R安装从sage中拉出来。这个包含所有必要系统库的本地副本,并且可能适用于面对我的情况的大多数人。但是,我的R代码依赖于仅与R> = 2.15兼容的一些R个包。

所以我从sage的lib目录中取出了所有库,并将它们复制到Renv的R-2.15.2安装中。这本来有用,但我大学的神鹰网格上的一些机器必须有一个奇怪的架构,因为大约有十分之一的工作回来了,错误与尝试使用错误版本的libc.so有关。此时,我放弃了提出的解决方案(2)并继续提出解决方案(1)。