【问题标题】:problem with snakemake submitting jobs with multiple wildcard on SGEsnakemake 在 SGE 上提交具有多个通配符的作业的问题
【发布时间】:2020-07-30 12:21:15
【问题描述】:

我之前在 LSF 集群上使用了蛇形,一切正常。但是,最近我迁移到 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 的集群上使用了完全相同的规则,没有任何问题。

一些细节

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\""   

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

另外,我知道--drmaa 标志,但我认为集群没有很好地配置。 --cluster 是迄今为止更强大的解决方案。

-- 编辑 1--

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

【问题讨论】:

  • 如果您将两者都作为交互式作业运行而不是将它们提交到集群会发生什么?
  • 如果我在前端运行snakemake,它会按预期工作。由于某种原因,这只是与调度程序的交互有问题。

标签: cluster-computing snakemake sungridengine


【解决方案1】:
-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'

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

【讨论】:

  • 哇,谢谢。我没有意识到问题出在我的日志规范中。单引号解决方案没有任何改变,实际上第二个解决方案会在我的 Snakemake 文件中生成太多样板,我拒绝这样做。幸运的是,默认情况下,只需编写 =o logs -e logs 就会产生非常好的输出(jobname == rulename; + job ID,这意味着至少每个日志都是唯一的,我接受)
  • 我根据我最后使用的方案提出了修改。
  • @KamilSJaron 如果您对自己的解决方案感到满意,将其发布为自己的答案可能会更好(我不介意编辑)。
  • 我很高兴接受你的,你首先发现了问题所在:-)
  • @KamilSJaron 添加一对额外的引号会发生什么,例如'\"logs/{rule}.{wildcards}.out\"'(也许您需要使用转义符)。我想知道第一对引号是否在到达 qsub 之前就被消耗掉了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2013-07-14
相关资源
最近更新 更多