Snakemake如何使用--cluster-status和sacct解析Slurm Jobid

时间:2018-12-23 20:34:29

标签: slurm snakemake

我正在使用snakemake调度程序(v14.11.4)运行大型slurm(v5.3.0)管道。不幸的是,约有1000个作业因NODE_FAILED(退出代码0)而崩溃,snakemake无法识别该错误,导致输出文件完成了一半。

为了使snakemake知道这一事件,我发现--cluster-status和使用jobid解析sacct的脚本应该可以解决问题。为此,我修改了在网上找到的脚本,现在看起来像这样:

#!/usr/bin/env python3
import os
import sys
import warnings
import subprocess

jobid = sys.argv[1]
state = subprocess.run(['sacct','-j',jobid,'--format=State'],stdout=subprocess.PIPE).stdout.decode('utf-8')
state = state.split('\n')[2].strip()

map_state={"PENDING":'running',
       "RUNNING":'running', 
       "SUSPENDED":'running', 
       "CANCELLED":'failed', 
       "COMPLETING":'running', 
       "COMPLETED":'success', 
       "CONFIGURING":'running', 
       "FAILED":'failed',
       "TIMEOUT":'failed',
       "PREEMPTED":'failed',
       "NODE_FAIL":'failed',
       "REVOKED":'failed',
       "SPECIAL_EXIT":'failed',
       "":'success'}

print(map_state[state])

该脚本在命令行中可以正常工作。但是,在按以下步骤启动snakemake时:

SM_ARGS="--cpus-per-task {cluster.cpus-per-task} --mem-per-cpu {cluster.mem-per-cpu-mb} --job-name {cluster.job-name} --ntasks {cluster.ntasks} --partition {cluster.partition} --time {cluster.time} --mail-user {cluster.mail-user} --mail-type {cluster.mail-type} --error {cluster.error} --output {cluster.output}"

snakemake -p \
$* \
 --latency-wait 120 \
-j 600 \
--cluster-config $(dirname $0)/cluster.slurm.json \
--cluster "sbatch $SM_ARGS" \
--cluster-status ~/scripts/snakemake/slurm_status.py

它开始提交第一批600个作业,此后基本上停滞了,没有其他作业提交。但是,所有最初提交的作业均成功完成。在所有作业都提交一个错误之后,snakemake日志就会产生:

sacct: error: slurmdbd: Getting response to message type 1444
sacct: error: slurmdbd: DBD_GET_JOBS_COND failure: No error

我假设我的命令没有将jobid正确解析为slurm_status.py。但是,我不知道snakemake是如何将jobid解析为slurm_status.py的,而Google无法回答这个问题(也没有通过snakemake --help获得的稀疏信息)。

感谢您的支持。

1 个答案:

答案 0 :(得分:0)

我从没使用过snakemake,但是我有一个猜测。来自snakemake文档:

For this it is necessary that the submit command provided to –cluster returns the cluster job id.

但是您的-cluster命令没有返回作业ID。它返回一个结尾为作业ID的字符串。 您可以尝试将参数--parsable添加到sbatch调用中。根据手册:

Outputs only the job id number and the cluster name if present. The values are separated by a semicolon. Errors will still be displayed.

如果这不起作用,您将必须设法从sbatch获取干净的作业ID。也许您可以将sbatch命令封装在另一个解析输出的脚本中:

!#/bin/bash

sbatch "$@" | awk '{print $4}'