Snakemake如何使用--cluster-status和sacct解析slurm jobid
How does Snakemake parse slurm jobid with --cluster-status and sacct used
我是 运行 使用 slurm
调度程序 (v14.11.4) 的大型 snakemake
(v5.3.0) 管道。不幸的是,约 1/1000 个作业因 NODE_FAILED(ExitCode 0)而崩溃,snakemake 无法识别,导致输出文件完成一半。
为了让 snakemake 意识到这一事件,我发现 --cluster-status
和一个使用 sacct
解析 jobid
的脚本应该可以解决问题。为了完成这项工作,我修改了一个我在网上找到的脚本,现在看起来像这样:
#!/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 [=11=])/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
获得的稀疏信息也不是)。
感谢您的支持。
我没用过snakemake
,但我有一个猜测。来自 snakemake
文档:
For this it is necessary that the submit command provided to –cluster returns the cluster job id.
但是您的 -cluster
命令没有 return 作业 ID。它 return 是一个字符串,最后是一个作业 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 }'
我是 运行 使用 slurm
调度程序 (v14.11.4) 的大型 snakemake
(v5.3.0) 管道。不幸的是,约 1/1000 个作业因 NODE_FAILED(ExitCode 0)而崩溃,snakemake 无法识别,导致输出文件完成一半。
为了让 snakemake 意识到这一事件,我发现 --cluster-status
和一个使用 sacct
解析 jobid
的脚本应该可以解决问题。为了完成这项工作,我修改了一个我在网上找到的脚本,现在看起来像这样:
#!/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 [=11=])/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
获得的稀疏信息也不是)。
感谢您的支持。
我没用过snakemake
,但我有一个猜测。来自 snakemake
文档:
For this it is necessary that the submit command provided to –cluster returns the cluster job id.
但是您的 -cluster
命令没有 return 作业 ID。它 return 是一个字符串,最后是一个作业 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 }'