snakemake 能否在 SLURM 集群上自动创建作业错误和输出文件?
Can snakemake create job error and output files automatically on a SLURM cluster?
我在 GNU/Linux Ubuntu 16.04.5.
工作
我在 Snakefile 中有以下规则:
rule cutadapt:
input:
reads = '{path2reads}/raw/reads.fq
output:
trimmed = '{path2reads}/trimmed/reads.fq
shell:
"cutadapt -q 20 --minimum-length 40 --output {output.trimmed} {input.reads}"
然后,在我的 slurm.json 文件中,我有:
...
"output": "output/log/job/output/{rule}%A.o",
"error": "output/log/job/error/{rule}%A.e",
...
在 Snakefile 中,我创建了文件夹 output/log/job/{error,output}
。
这很好用,大概是因为 snakemake 不必创建新文件夹来存储作业的错误和输出,我 运行 是这样的:
snakemake output/reads/trimmed/reads.fq --cluster-config slurm.json --cluster "sbatch ... --output {cluster.output} --error {cluster.error} ..."
因此 path2reads
将被计算为 output/reads
。
请注意,我省略了我认为与本次讨论无关的参数。
但是,我希望 SLURM 将我的结果存储在文件夹 output/lob/job/error/{rule}{wildcards}.e
和 output/lob/job/output/{rule}{wildcards}.o
中。如果我将这些文件夹放入我的 slurm.json 文件中,作业就会失败。此结构 ...{rule}{wildcards}...
适用于不需要创建新文件夹的其他规则(因为通配符不包含文件夹路径`。
我怎样才能解决这个问题?我知道我可以事先找出所有文件夹并在 运行ning snakemake 之前创建它们,但这似乎效率不高。 snakemake 中没有为我做这个的功能吗?毕竟,snakemake 会创建所有不存在的输出、基准和日志文件夹。为什么它不对 SLURM 错误和输出文件执行此操作?
2019 年 4 月 24 日更新基于 Johannes Koester 的回复:
我已将规则更改为:
rule cutadapt:
input:
reads = '{path2reads}/raw/reads.fq
output:
trimmed = '{path2reads}/trimmed/reads.fq
log:
output = 'output/log/snakemake/output/cutadapt/path2reads={path2reads}.o',
error = 'output/log/snakemake/error/cutadapt/path2reads={path2reads}.e',
jobError = 'output/log/job/error/cutadapt/path2reads={path2reads}.e',
jobOutput = 'output/log/job/output/cutadapt/path2reads={path2reads}.o',
shell:
'cutadapt -q 20 --minimum-length 40 --output {output.trimmed} {input.reads} > {log.output} 2> {log.error}'
和运行以下snakemake命令:
snakemake paths/2/reads/trimmed/reads.fq --cluster-config slurm.json --cluster "sbatch ... --output {cluster.output} --error {cluster.error} ..."
我的作业失败了,一些日志目录丢失了。我看到目录 output/log/job/{error,output}
但它们是空的。我没有看到目录 output/log/snakemake
。但是,如果我首先创建目录 output/log/{job,snakemake}/{error,output}/cutadapt/path2reads=path/2/reads/
,那么作业就会成功。
如果我在头节点上运行 snakemake,它也可以。注意我的 slurm.json 有以下 fastqc 参数(默认参数未显示):
"fastqc" :
{
"output" : "output/log/job/output/{rule}/{wildcards}.o",
"error" : "output/log/job/error/{rule}/{wildcards}.e"
},
你知道哪里出了问题吗?
无法通过 snakemake 确保这一点。然而,如果你使用 snakemake 本身的日志记录支持,这个问题根本不会发生,它具有独立于执行平台的额外好处:https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#log-files
在那种情况下,目录当然会由 snakemake 创建,因为它们还不存在。此外,错误消息将直接指向正确的日志文件。
我在 GNU/Linux Ubuntu 16.04.5.
工作我在 Snakefile 中有以下规则:
rule cutadapt:
input:
reads = '{path2reads}/raw/reads.fq
output:
trimmed = '{path2reads}/trimmed/reads.fq
shell:
"cutadapt -q 20 --minimum-length 40 --output {output.trimmed} {input.reads}"
然后,在我的 slurm.json 文件中,我有:
...
"output": "output/log/job/output/{rule}%A.o",
"error": "output/log/job/error/{rule}%A.e",
...
在 Snakefile 中,我创建了文件夹 output/log/job/{error,output}
。
这很好用,大概是因为 snakemake 不必创建新文件夹来存储作业的错误和输出,我 运行 是这样的:
snakemake output/reads/trimmed/reads.fq --cluster-config slurm.json --cluster "sbatch ... --output {cluster.output} --error {cluster.error} ..."
因此 path2reads
将被计算为 output/reads
。
请注意,我省略了我认为与本次讨论无关的参数。
但是,我希望 SLURM 将我的结果存储在文件夹 output/lob/job/error/{rule}{wildcards}.e
和 output/lob/job/output/{rule}{wildcards}.o
中。如果我将这些文件夹放入我的 slurm.json 文件中,作业就会失败。此结构 ...{rule}{wildcards}...
适用于不需要创建新文件夹的其他规则(因为通配符不包含文件夹路径`。
我怎样才能解决这个问题?我知道我可以事先找出所有文件夹并在 运行ning snakemake 之前创建它们,但这似乎效率不高。 snakemake 中没有为我做这个的功能吗?毕竟,snakemake 会创建所有不存在的输出、基准和日志文件夹。为什么它不对 SLURM 错误和输出文件执行此操作?
2019 年 4 月 24 日更新基于 Johannes Koester 的回复:
我已将规则更改为:
rule cutadapt:
input:
reads = '{path2reads}/raw/reads.fq
output:
trimmed = '{path2reads}/trimmed/reads.fq
log:
output = 'output/log/snakemake/output/cutadapt/path2reads={path2reads}.o',
error = 'output/log/snakemake/error/cutadapt/path2reads={path2reads}.e',
jobError = 'output/log/job/error/cutadapt/path2reads={path2reads}.e',
jobOutput = 'output/log/job/output/cutadapt/path2reads={path2reads}.o',
shell:
'cutadapt -q 20 --minimum-length 40 --output {output.trimmed} {input.reads} > {log.output} 2> {log.error}'
和运行以下snakemake命令:
snakemake paths/2/reads/trimmed/reads.fq --cluster-config slurm.json --cluster "sbatch ... --output {cluster.output} --error {cluster.error} ..."
我的作业失败了,一些日志目录丢失了。我看到目录 output/log/job/{error,output}
但它们是空的。我没有看到目录 output/log/snakemake
。但是,如果我首先创建目录 output/log/{job,snakemake}/{error,output}/cutadapt/path2reads=path/2/reads/
,那么作业就会成功。
如果我在头节点上运行 snakemake,它也可以。注意我的 slurm.json 有以下 fastqc 参数(默认参数未显示):
"fastqc" :
{
"output" : "output/log/job/output/{rule}/{wildcards}.o",
"error" : "output/log/job/error/{rule}/{wildcards}.e"
},
你知道哪里出了问题吗?
无法通过 snakemake 确保这一点。然而,如果你使用 snakemake 本身的日志记录支持,这个问题根本不会发生,它具有独立于执行平台的额外好处:https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#log-files
在那种情况下,目录当然会由 snakemake 创建,因为它们还不存在。此外,错误消息将直接指向正确的日志文件。