在SGE上使用多个通配符提交snakemake作业的问题



我以前在LSF集群上使用过snakemake,一切都很好。然而,最近我迁移到SGE集群,当我尝试使用多个通配符运行作业时,我遇到了一个非常奇怪的错误。

当我尝试基于此规则提交作业时

rule download_reads :
threads : 1
output : "data/{sp}/raw_reads/{accesion}_1.fastq.gz"
shell : "scripts/download_reads.sh {wildcards.sp} {wildcards.accesion} data/{wildcards.sp}/raw_reads/{wildcards.accesion}"

我收到以下错误(snakemake_clust.sh详细信息如下(

./snakemake_clust.sh data/Ecol1/raw_reads/SRA123456_1.fastq.gz                                          
Building DAG of jobs...
Using shell: /bin/bash
Provided cluster nodes: 10
Job counts:
count   jobs
1       download_reads
1
[Thu Jul 30 12:08:57 2020]
rule download_reads:
output: data/Ecol1/raw_reads/SRA123456_1.fastq.gz
jobid: 0
wildcards: sp=Ecol1, accesion=SRA123456
scripts/download_reads.sh Ecol1 SRA123456 data/Ecol1/raw_reads/SRA123456
Unable to run job: ERROR! two files are specified for the same host
ERROR! two files are specified for the same host
Exiting.
Error submitting jobscript (exit code 1):
Shutting down, this might take some time.

当我用一个常量替换sp通配符时,它会按预期工作:

rule download_reads :
threads : 1
output : "data/Ecol1/raw_reads/{accesion}_1.fastq.gz"
shell : "scripts/download_reads.sh Ecol1 {wildcards.accesion} data/Ecol1/raw_reads/{wildcards.accesion}"

即我得到

Submitted job 1 with external jobid 'Your job 50731 ("download_reads") has been submitted'.

我想知道为什么我会有这个问题,我确信我以前在基于LSF的集群上使用了完全相同的规则,没有任何问题。

一些细节

提交Snake的脚本看起来像这个

#!/usr/bin/env bash                                                                                                                                                                
                                                                                                             
mkdir -p logs                                                                                                                                                                      
                                                                                                             
snakemake $@ -p --jobs 10 --latency-wait 120 --cluster "qsub                                                                                                                      
-N {rule}                                                                                                                                                                     
-pe smp64                                                                                                                                                                     
{threads}                                                                                                                                                                     
-cwd                                                                                                                                                                          
-b y                                                                                                                                                                          
-o "logs/{rule}.{wildcards}.out"                                                                                                                                            
-e "logs/{rule}.{wildcards}.err""   

-b y使命令按原样执行,-cwd将计算节点上的工作目录更改为提交作业的工作目录。我希望其他标志/规格是明确的。

此外,我知道--drmaa标志,但我认为out-cluster并没有为此做好配置。到目前为止,--cluster是一个更健壮的解决方案。

--编辑1-

当我在本地执行完全相同的snake文件时(在前端,没有--cluster标志(,脚本将按预期执行。这似乎是一个snakemake和调度器交互的问题。

-o "logs/{rule}.{wildcards}.out"                                                                                                                                            
-e "logs/{rule}.{wildcards}.err""   

这是一个随机的猜测。。。在将多个通配符替换为logs/{rule}.{wildcards}.err之前,会用空格连接多个通配符。因此,尽管使用了双引号,SGE还是将生成的字符串视为两个文件,并抛出错误。如果你使用单引号怎么办?类似:

-o 'logs/{rule}.{wildcards}.out'                                                                                                                                            
-e 'logs/{rule}.{wildcards}.err'

或者,您可以将规则中的通配符连接起来,并在命令行中使用结果。例如:

rule one:
params:
wc= lambda wc: '_'.join(wc)
output: ...

然后使用:

-o 'logs/{rule}.{params.wc}.out'                                                                                                                                            
-e 'logs/{rule}.{params.wc}.err'

(第二种解决方案,如果有效的话,有点糟糕(

最新更新