Snakemake在群集上运行远程文件下载

时间:2019-12-21 00:14:41

标签: python amazon-s3 boto3 hpc snakemake

我正在尝试从一些公共S3存储桶中下载数十个大文件(每个文件10-25 GB)。我是在HPC群集的用户存储配额有限的情况下执行此操作的。通常,我的用户目录下有Snakemake管道,但其中包含一个存放大型文件的符号链接文件夹(data)。

我尝试运行以下内容:

from snakemake.remote.S3 import RemoteProvider as S3RemoteProvider

S3 = S3RemoteProvider()

rule all:
  input: 
    "data/bam/3_month/10X_P4_0.bam", 
    "data/bam/3_month/10X_P4_1.bam", 
    "data/bam/3_month/10X_P4_2.bam"

rule bam_download_s3:
  input:
    bam=lambda wcs: S3.remote("czb-tabula-muris-senis/10x/%s/%s/possorted_genome_bam.bam" % (wcs.age, wcs.sample))
  output:
    "data/bam/{age}/{sample}.bam"
  shell:
    """
    cp {input.bam} {output}
    """

尽管使用的是放大版本,但我基本上是在下载所有内容,并使用--cluster-j标志来实现。

我希望这可以将多个作业推送到我的群集中,并且每个作业都下载其分配的文件。相反,Snakemake开始使用存储桶路径将本地进程中的每个文件下载到本地文件夹中。我没有等待它耗尽我的配额(这很容易拥有),但是看起来集群作业最终只会复制本地文件。

Snakemake中是否可以直接将下载推送到群集作业并指定下载位置?

我可以想到一些解决方法:例如,创建一个以存储桶名称作为Snakemake将临时文件转储到其中的别名的符号链接文件夹。或完全放弃Snakemake的RemoteProvider(除了验证文件是否存在),并使用单独的CLI工具从S3下拉。但是,这一切都打破了Snakemake似乎旨在提供的跨遥控器透明使用的饰面。

1 个答案:

答案 0 :(得分:1)

我无法对此进行测试,但是没关系:

remote_bam = "czb-tabula-muris-senis/10x/{age}/{sample}/possorted_genome_bam.bam"

rule bam_download_s3:
    input:
        # Some logic to only check the remote file exists and is older than output. 
        # `stay_on_remote= True` may do the trick
        bam=S3.remote(remote_bam, stay_on_remote=True)
    output:
        bam="data/bam/{age}/{sample}.bam"
    params:
        # use this for the wildcard substitution
        bam=remote_bam
    run:
        os.chdir(os.path.dirname(output.bam)) # move to dir with lots of space 
        S3.remote(params.bam) # do the actual download
        os.rename(params.bam, output.bam) # move file to final destination