在将后续作业提交到PBS群集之前,等待用户的所有作业完成

msc*_*lli 5 shell cluster-computing wait qsub pbs

我试图调整一些bash脚本,使它们在()集群上运行.

各个任务由几个由主脚本启动的脚本执行.到目前为止,这个主要脚本在后台启动多个脚本(通过附加&),使它们在一个多核机器上并行运行.我希望用qsubs 代替这些调用来分配集群节点的负载.

但是,有些工作依赖于其他工作才能开始.到目前为止,这是通过wait主脚本中的语句实现的.但是使用Grid Engine的最佳方法是什么?

我已经在手册页中找到了这个问题-W after:jobid[:jobid...]文档,qsub但我希望有更好的方法.我们正在谈论几个并行运行的thousend作业和另一个相同大小的一组,以便在最后一个完成之后同时运行.这意味着我必须根据很多工作排队很多工作.

我可以通过在中间使用虚拟作业来减少这种情况,除了取决于第二组可能依赖的第一组作业之外什么都不做.这会将依赖数量从数百万减少到数千,但仍然是:它是错误的,我甚至不确定shell是否会接受如此长的命令行.

  • 有没有办法等待的所有工作完成(类似的东西qwait -u <user>)?
  • 或者从这个脚本提交的所有作业(类似的东西qwait [-p <PID>])?

当然可以在循环中使用qstat和编写这样的东西,但我想这个用例非常重要,有一个内置的解决方案,我只是无法想出那个.sleepwhile

在这种情况下你会推荐/使用什么?

附录一:

由于在评论中要求:

$ qsub --version
version: 2.4.8
Run Code Online (Sandbox Code Playgroud)

也许也有助于确定准确的系统:

$ qsub --help
usage: qsub [-a date_time] [-A account_string] [-b secs]
      [-c [ none | { enabled | periodic | shutdown |
      depth=<int> | dir=<path> | interval=<minutes>}... ]
      [-C directive_prefix] [-d path] [-D path]
      [-e path] [-h] [-I] [-j oe] [-k {oe}] [-l resource_list] [-m n|{abe}]
      [-M user_list] [-N jobname] [-o path] [-p priority] [-P proxy_user] [-q queue]
      [-r y|n] [-S path] [-t number_to_submit] [-T type] [-u user_list] [-w] path
      [-W otherattributes=value...] [-v variable_list] [-V] [-x] [-X] [-z] [script]
Run Code Online (Sandbox Code Playgroud)

由于注释指向作业数组到目前为止我搜索了qsub手册页,结果如下:

[...]
DESCRIPTION
[...]
       In addition to the above, the following environment variables will be available to the batch job.
[...]
       PBS_ARRAYID
              each member of a job array is assigned a unique identifier (see -t)
[...]
OPTIONS
[...]
       -t array_request
               Specifies the task ids of a job array. Single task arrays are allowed.
               The array_request argument is an integer id or a range of integers. Multiple ids or id ranges can be combined in a comman delimeted list. Examples : -t 1-100 or -t 1,10,50-100
[...]
Run Code Online (Sandbox Code Playgroud)

附录二:

我已经尝试过Dmitri Chubarov给出的解决方案,但它没有按照描述的那样工作.

没有工作,它按预期工作:

testuser@headnode ~ $ qsub -W depend=afterok:`qsub ./test1.sh` ./test2 && qstat
2553.testserver.domain
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2552.testserver         Test1            testuser               0 Q testqueue
2553.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2552.testserver         Test1            testuser               0 R testqueue
2553.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2553.testserver         Test2            testuser               0 R testqueue
Run Code Online (Sandbox Code Playgroud)

但是,使用作业数组第二个作业将无法启动:

testuser@headnode ~ $ qsub -W depend=afterok:`qsub -t 1-2 ./test1.sh` ./test2 && qstat
2555.testserver.domain
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2554-1.testserver       Test1-1          testuser               0 Q testqueue
2554-2.testserver       Test1-1          testuser               0 Q testqueue
2555.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2554-1.testserver       Test1-1          testuser               0 R testqueue
2554-2.testserver       Test1-2          testuser               0 R testqueue
2555.testserver         Test2            testuser               0 H testqueue
testuser@headnode ~ $ qstat
Job id                  Name             User            Time Use S Queue
----------------------- ---------------- --------------- -------- - -----
2555.testserver         Test2            testuser               0 H testqueue
Run Code Online (Sandbox Code Playgroud)

我想这是由于第一个返回的作业ID中缺少数组指示qsub:

testuser@headnode ~ $ qsub -t 1-2 ./test1.sh
2556.testserver.domain
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,没有...[]迹象表明这是一个工作阵列.此外,在qsub输出有没有...[]秒,但...-1...-2指示该阵列.

所以剩下的问题是如何格式化-W depend=afterok:...作业取决于指定的作业数组.

Dmi*_*rov 6

填写Jonathan在评论中提出的解决方案.

基于最初的Portable Batch System有几个资源管理器:OpenPBS,TORQUE和PBS Professional.这些系统显着不同,并且对诸如作业数组之类的新功能使用不同的命令语法.

作业数组是基于相同作业脚本提交多个类似作业的便捷方式.引自手册:

有时用户会希望基于相同的作业脚本提交大量作业.现在存在称为作业数组的功能,而不是使用脚本重复调用qsub,以允许使用一个qsub命令创建多个作业.

要提交作业数组,PBS提供以下语法:

 qsub -t 0-10,13,15 script.sh
Run Code Online (Sandbox Code Playgroud)

这提交了来自0,1,2,...,10,13,15的ID的作业.

在脚本中,变量PBS_ARRAYID携带数组中作业的id,并可用于选择必要的配置.

作业数组具有其特定的依赖选项.

TORQUE

可能在OP中使用的TORQUE资源管理器.提供了其他依赖选项,可在以下示例中看到:

$ qsub -t 1-1000 script.sh
1234[].pbsserver.domainname
$ qsub -t 1001-2000 -W depend=afterokarray:1234[] script.sh
1235[].pbsserver.domainname
Run Code Online (Sandbox Code Playgroud)

这将导致以下qstat输出

1234[]         script.sh    user          0 R queue
1235[]         script.sh    user          0 H queue   
Run Code Online (Sandbox Code Playgroud)

扭矩版3.0.4测试

完整的afterokarray语法在qsub(1)手册中.

PBS专业版

在PBS Professional中,依赖关系可以在普通作业和数组作业上统一工作.这是一个例子:

$ qsub -J 1-1000 -ry script.sh
1234[].pbsserver.domainname
$ qsub -J 1001-2000 -ry -W depend=afterok:1234[] script.sh
1235[].pbsserver.domainname
Run Code Online (Sandbox Code Playgroud)

这将导致以下qstat输出

1234[]         script.sh    user          0 B queue
1235[]         script.sh    user          0 H queue   
Run Code Online (Sandbox Code Playgroud)

扭矩版本更新

从版本2.5.3开始,Torque中提供了数组依赖性.版本2.5中的作业数组与版本2.3或2.4中的作业数组不兼容.特别[]是从2.5版开始在Torque中引入了语法.

更新使用分隔工作

对于2.5之前的扭矩版本,可以使用不同的解决方案,该解决方案基于在要分离的批次作业之间提交虚拟分隔工作.它使用了三个依赖类型:on,before,和after.

请考虑以下示例

 $ DELIM=`qsub -Wdepend=on:1000 dummy.sh `
 $ qsub -Wdepend=beforeany:$DELIM script.sh
 1001.pbsserver.domainname
 ... another 998 jobs ...
 $ qsub -Wdepend=beforeany:$DELIM script.sh
 2000.pbsserver.domainname
 $ qsub -Wdepend=after:$DELIM script.sh
 2001.pbsserver.domainname
 ...
Run Code Online (Sandbox Code Playgroud)

这将导致这样的队列状态

1000         dummy.sh    user          0 H queue
1001         script.sh   user          0 R queue   
...
2000         script.sh   user          0 R queue   
2001         script.sh   user          0 H queue
...   
Run Code Online (Sandbox Code Playgroud)

这就是#2001工作仅在前1000个作业终止后才会运行.可能也可以使用TORQUE 2.4中提供的基本作业数组工具来提交脚本作业.

此解决方案也适用于TORQUE 2.5及更高版本.