2010-06-29 74 views
8

我在多节点Linux集群上运行R。我想在不使用并行计算软件(如MPI或雪)的情况下使用脚本或批处理模式在R上运行我的分析。R编程 - 使用PBS在多节点linux集群上提交作业

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

我的问题是我该如何解决这个问题?我不知道我应该如何编写我的脚本。一个例子会非常有帮助!

我一直在使用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

+0

您确定pbs启动多个实例吗? 尝试在作业批处理文件 – Anycorn 2010-06-29 21:25:35

回答

2

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

+2

中添加'echo $(主机名)'这是一个有趣的建议。你能不能请使用“commandArgs”和“PBS”脚本与我们分享你的Rscript?关于如何去做它并不明显。谢谢 – Tony 2011-01-11 15:40:16

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="")... 

然后,我将所有的输出之后...

1

This问题似乎非常适合使用GNU并行。 GNU并行有一个很好的教程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的可用性,它是在原始问题发布后提供的。希望别人能够提供更具体的例子。另外,我仍然摇摆不定地使用parallel,例如,我不确定-j2选项。 (请参阅我的related question。)

相关问题