R编程 - 使用PBS在多节点linux集群上提交作业

时间:2010-06-29 21:15:06

标签: linux r parallel-processing pbs

我在多节点Linux集群上运行R.我想使用脚本或批处理模式在R上运行我的分析,而不使用MPI或snow等并行计算软件。

我知道这可以通过划分输入数据来完成,这样每个节点都可以运行不同的数据部分。

我的问题是如何准确地解决这个问题?我不确定如何编写脚本代码。一个例子非常有用!

到目前为止,我一直在使用PBS运行我的脚本,但它似乎只在一个节点上运行,因为R是一个单线程程序。因此,我需要弄清楚如何调整我的代码,以便将人工分配给所有节点。

以下是我迄今为止所做的事情:

1)命令行:

> qsub myjobs.pbs

2)myjobs.pbs:

> #!/bin/sh
> #PBS -l nodes=6:ppn=2
> #PBS -l walltime=00:05:00
> #PBS -l arch=x86_64
> 
> pbsdsh -v $PBS_O_WORKDIR/myscript.sh

3)myscript.sh:

#!/bin/sh
cd $PBS_O_WORKDIR
R CMD BATCH --no-save my_script.R

4)my_script.R:

> library(survival)
> ...
> write.table(test,"TESTER.csv",
> sep=",", row.names=F, quote=F)

任何建议将不胜感激!谢谢!

-CC

3 个答案:

答案 0 :(得分:2)

这是一个PBS问题;我通常会创建一个R脚本(在#!之后使用Rscript路径)并使其收集一个参数(使用commandArgs函数)来控制当前实例应该生成的“部分作业”。因为我经常使用multicore,所以我通常只需要使用3-4个节点,所以我只提交几个作业,用每个可能的控制参数值调用这个R脚本。
另一方面,您对pbsdsh的使用应该起作用......然后PBS_TASKNUM的值可以用作控制参数。

答案 1 :(得分:1)

这是对相关问题的回答 - 但它也是对上述评论的回答(也是)。

对于我们的大部分工作,我们使用qsub(而不是)并行运行多个R会话。

如果是我常用的多个文件:

while read infile rest
do
qsub -v infile=$infile call_r.pbs 
done < list_of_infiles.txt

call_r.pbs:

...
R --vanilla -f analyse_file.R $infile
...

analyse_file.R:

args <- commandArgs()
infile=args[5]
outfile=paste(infile,".out",sep="")...

然后我将所有输出结合起来......

答案 2 :(得分:1)

这个问题似乎非常适合使用GNU parallel。 GNU parallel有一个很好的教程here。我不熟悉pbsdsh,我是HPC的新手,但对我来说,pbsdsh看起来像GNU parallel的目的相似。我也不熟悉从命令行使用参数启动R,但这里是我对你的PBS文件看起来的猜测:

#!/bin/sh
#PBS -l nodes=6:ppn=2
#PBS -l walltime=00:05:00
#PBS -l arch=x86_64
...
parallel -j2 --env $PBS_O_WORKDIR --sshloginfile $PBS_NODEFILE \
  Rscript myscript.R {} :::: infilelist.txt

其中infilelist.txt列出了您要处理的数据文件,例如:

inputdata01.dat
inputdata02.dat
...
inputdata12.dat

您的myscript.R将访问命令行参数以加载和处理指定的输入文件。

我的主要目的是指出GNU并行的可用性,这是在原始问题发布后出现的。希望其他人可以提供一个更切实的例子。此外,我仍然对parallel的使用感到不稳定,例如,我不确定-j2选项。 (见我的related question。)