从strigger

时间:2018-04-26 19:08:55

标签: r linux batch-processing hpc slurm

我的R分析由三部分组成(partApartBpartC)。我将每个部分提交给SLURM(例如sbatch partA),并且每个部分都通过#SBATCH --array=1-1500进行并行化。这些部件是串行的,所以我需要在开始下一个之前等待一个完成。现在我手动开始每项工作,但这不是一个好的解决方案。

我想自动执行三个sbatch调用。例如:

  1. sbatch partA
  2. 完成partA时,sbatch partB
  3. 完成partB时,sbatch partC
  4. 我使用this solution获取partA的职位ID,并将其传递给strigger以完成上述第2步。但是,我仍然坚持这一点,因为我不知道如何从partB 获取strigger的工作ID。这是我的代码的样子:

    #!/bin/bash
    
    # step 1: sbatch partA
    partA_ID=$(sbatch --parsable partA.sh)
    
    # step 2: sbatch partB
    strigger --set --jobid=$partA_ID --fini --program=/path/to/partB.batch
    
    # step 3: sbatch partC
    ... ?
    

    如何完成第3步?

1 个答案:

答案 0 :(得分:2)

heroku certs:auto 不是实现该目标的正确工具,它更多地针对管理员而非常规用户。只有strigger才能实际设置触发器(请参阅strigger manpage中的"重要说明")。

在您的情况下,您应该一次提交所有三个作业,并在其中设置依赖项。

例如:

slurm user

这将提交三个作业数组,但第二个仅在第一个作业完成后才开始。而第三个只会在第二个工作完成后才开始。

替代方案可以是

$ partA_ID=$(sbatch --parsable partA.sh)
$ partB_ID=$(sbatch --parsable --dependency=afterany:${partA_ID} partB.sh)
$ partC_ID=$(sbatch --parsable --dependency=afterany:${partB_ID} partC.sh)

这将提交三个作业数组,但第二个作业中的所有作业将不会启动,直到第一个作业中的相应作业(即具有相同$ partA_ID=$(sbatch --parsable partA.sh) $ partB_ID=$(sbatch --parsable --dependency=aftercorr:${partA_ID} partB.sh) $ partC_ID=$(sbatch --parsable --dependency=aftercorr:${partB_ID} partC.sh) 的作业)完成。并且第三个作业中的所有作业只有在第二个作业中的相应作业完成时才会开始。

有关详细信息,请参阅sbatch manpage中的$SLURM_ARRAY_TASK_ID部分。