snakemake 在 SGE 上使用多个通配符提交作业的问题
problem with snakemake submitting jobs with multiple wildcard on SGE
我之前在 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 的集群上使用完全相同的规则没有任何问题。
一些细节
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和scheduler交互的问题
-o \"logs/{rule}.{wildcards}.out\" \
-e \"logs/{rule}.{wildcards}.err\""
这是一个随机猜测...在将它们替换为 logs/{rule}.{wildcards}.err
之前,多个通配符由 space 连接。因此,尽管您使用双引号,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'
(第二个解决方案,如果可行的话,有点糟糕)
我之前在 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 的集群上使用完全相同的规则没有任何问题。
一些细节
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和scheduler交互的问题
-o \"logs/{rule}.{wildcards}.out\" \
-e \"logs/{rule}.{wildcards}.err\""
这是一个随机猜测...在将它们替换为 logs/{rule}.{wildcards}.err
之前,多个通配符由 space 连接。因此,尽管您使用双引号,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'
(第二个解决方案,如果可行的话,有点糟糕)