Condor的沙盒R(在Linux上)

Condor的沙盒R(在Linux上),linux,r,condor,Linux,R,Condor,我的大学运行一个condor计算网格(计算节点运行Linux),我想用它在R中运行模拟。问题是网格上只有一些机器安装了R。到目前为止,我看到了两个选项,但我不知道如何实现这两个选项,因此我希望您能帮助我(请记住,我不是系统管理员,也不能对计算节点的设置做太多更改): 1) 在与我的condor submit文件一起出现的类广告中打勾,要求在具有/usr/bin/R的节点上计算作业 2) 将R及其所有依赖项打包到一个自包含的目录中,该目录可以发送到计算节点,并且可以针对该目录运行我的模拟。我已经尝

我的大学运行一个condor计算网格(计算节点运行Linux),我想用它在R中运行模拟。问题是网格上只有一些机器安装了R。到目前为止,我看到了两个选项,但我不知道如何实现这两个选项,因此我希望您能帮助我(请记住,我不是系统管理员,也不能对计算节点的设置做太多更改):

1) 在与我的condor submit文件一起出现的类广告中打勾,要求在具有
/usr/bin/R
的节点上计算作业

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

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

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

在hadley的建议下,我曾经将R安装到一个已知的本地目录(也用于构建R-2.15.2)。不幸的是,这个本地安装仍然依赖于来自
/usr/lib
等位置的系统范围的库

MvG建议将本地R安装从中拉出。这个方法附带了所有必要的系统库的本地副本,对于大多数面临我这种情况的人来说可能是一种可行的方法。但是,我的
R
代码依赖于一些仅与
R
=2.15兼容的
R
软件包


因此,我从sage的
lib
目录中获取了所有库,并将它们从Renv复制到R-2.15.2安装中。这本来是可行的,但我所在大学的condor网格上的一些机器肯定有一个奇怪的体系结构,因为大约十分之一的工作返回时出现了与尝试使用错误版本的
libc.so
相关的错误。此时,我放弃了提议的解决方案(2),转而使用提议的解决方案(1)。

最终对我有效的是提议的解决方案(1)。这里我将讨论如何在condor提交文件和worker shell脚本中实现(1)

这是shell脚本。重要的更改是通过:
if[-f/usr/bin/R]
检查计算节点上是否安装了R。如果找到R,我们沿着返回值为0的路径前进。如果未找到R,则返回1(这是行
exit 0
exit 1
的含义)

现在,秃鹰提交文件。关键的变化是倒数第二行(
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

对于2,可能有助于以路径独立的方式将bundle R(以及其他许多bundle)打包。也许你可以看看他们是怎么做的。在许多情况下,将
LD_LIBRARY_PATH
导出到库所在的目录就足够了。谢谢你们两位@MvG:我不知道sage捆绑包R-也许我可以通过将sage发送到计算节点来利用它。您可以使用install.packages(lib.loc=)和lib.loc=)强制安装/从特定目录加载包
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