Snakemake 在 SGE 上提交带有多个通配符的作业时出现问题

Kam*_*ron 5 cluster-computing sungridengine 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}"
Run Code Online (Sandbox Code Playgroud)

我收到以下错误(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.
Run Code Online (Sandbox Code Playgroud)

当我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}"
Run Code Online (Sandbox Code Playgroud)

即我得到

Submitted job 1 with external jobid 'Your job 50731 ("download_reads") has been submitted'.
Run Code Online (Sandbox Code Playgroud)

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

一些细节

Snakemake 提交脚本如下所示

#!/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\""   
Run Code Online (Sandbox Code Playgroud)

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

另外,我知道--drmaa标志,但我认为集群没有为此配置良好。--cluster到目前为止,这是一个更强大的解决方案。

-- 编辑1 --

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

dar*_*ber 3

-o \"logs/{rule}.{wildcards}.out\" \                                                                                                                                           
-e \"logs/{rule}.{wildcards}.err\""   
Run Code Online (Sandbox Code Playgroud)

这是一种随机猜测...多个通配符在替换为 之前通过空格连接起来logs/{rule}.{wildcards}.err。因此,尽管您使用双引号,SGE 仍会将结果字符串视为两个文件并引发错误。如果改用单引号怎么办?喜欢:

-o 'logs/{rule}.{wildcards}.out' \                                                                                                                                           
-e 'logs/{rule}.{wildcards}.err'
Run Code Online (Sandbox Code Playgroud)

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

rule one:
    params:
        wc= lambda wc: '_'.join(wc)
    output: ...
Run Code Online (Sandbox Code Playgroud)

然后使用:

-o 'logs/{rule}.{params.wc}.out' \                                                                                                                                           
-e 'logs/{rule}.{params.wc}.err'
Run Code Online (Sandbox Code Playgroud)

(第二个解决方案,如果它有效的话,虽然有点糟糕)