ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

RNA-seq公共测序数据下载实战:SRA Toolkit与Aspera高效获取sra/fastq.gz

RNA-seq公共测序数据下载实战:SRA Toolkit与Aspera高效获取sra/fastq.gz

RNA-seq数据分析的上游工作,最磨人的往往不是比对和定量,而是怎么把几百个G的原始测序数据从公共数据库拖回本地。公共测序数据仓库里存放着海量的.sra归档文件和.fastq.gz原始序列,前者是官方归档格式,后者才是可以直接进入质控和比对的格式。这篇笔记是我RNA-seq流程学习系列的第二篇,重点记录我用SRA Toolkit和Aspera这两个工具下载.sra和.fastq.gz数据的全过程,包括命令参数、路径规则、断点续传、完整性校验这些实操细节,以及踩过的几个坑。

不管你是刚接触生物信息学的新手,还是已经被数据下载折磨过几轮的“老油条”,这篇内容都能帮你少走弯路。整个文章会从工具选型讲起,逐步拆解两套下载方案的完整命令和执行逻辑,最后给出常见问题的排查手册。内容偏实战,所有命令我都实测过,可以直接改改路径拿去用。

1. 项目背景与整体设计拆解

1.1 为什么RNA-seq分析的第一步是搞定数据下载

RNA-seq流程从原始测序数据开始,一般顺序是:获得原始数据 -> 质控 -> 比对到参考基因组 -> 转录本定量 -> 差异表达分析。绝大多数公共RNA-seq项目的数据都会提交到SRA数据库(Sequence Read Archive),每个数据集有一个唯一编号。以常见的编号为例,SRR开头代表一次测序run,SRX代表实验,SRS代表样本,SRP代表整个项目。下载数据时,你面对的通常是SRR编号。

很多人以为下载数据就是把文件拉到本地这么简单,但实际上有几个关键问题必须提前想清楚。

第一个问题是格式。SRA数据库里存储的官方归档格式是.sra,这是为了压缩存储和完整保留测序信息而设计的二进制格式。下游工具如比对软件通常不直接支持.sra,需要转换成.fastq或.fastq.gz。所以数据下载和格式转换是两件紧密相关的事。

第二个问题是体积。单个RNA-seq样本的双端测序数据,fastq.gz通常在2到10G,.sra归档格式会稍小一点,但一个项目几十个样本加起来就是几十到几百G。如果下载工具选得不合适,速度会非常难受。

第三个问题是传输协议。传统的HTTP和FTP基于TCP协议,在网络延迟高、丢包率高的场景下,速度很难提上去。公共数据仓库通常位于海外,用普通方式下载大文件,跑一晚上都未必能搞定一个样本。

我在设计整个下载流程时,采用了“双工具组合”策略:SRA Toolkit负责官方数据格式的获取和转换,Aspera负责利用其基于UDP的高速传输能力直接抓取文件。这样既保证了数据来源的权威性,又能大幅提升传输效率。

1.2 下载流程的整体架构和数据流向

我的整体执行思路可以拆成三条路径,根据实际需求选择即可。

路径A:用SRA Toolkit的prefetch命令下载.sra文件,再用fasterq-dump或fastq-dump转换成.fastq格式。这条路径最稳妥,因为prefetch是官方工具,完全按照数据仓库的存储结构下载,还支持断点续传。

路径B:用Aspera直接下载.sra文件。和路径A类似,但传输通道换成了Aspera的高速协议。例如执行ascp命令,加上密钥文件和带宽限制参数,从SRA官方开放服务器上把.sra拖回本地。这条路径在下载大体积.sra时优势明显。

路径C:用Aspera直接下载.fastq.gz文件。很多公共数据仓库会把fastq格式也开放出来,路径层级通常是按SRR编号的前缀字母组织的。这种方式适合只想快速拿到clean reads做下游分析的人,省去了本地格式转换的耗时。

这三条路径不是互斥的。我在实际项目中通常是先用Aspera批量抓取.fastq.gz,遇到某些镜像站点没有对应文件时,再用prefetch兜底下载.sra再转换。两条路配合,基本能覆盖所有情况。

2. 工具选型解析:为什么是SRA Toolkit和Aspera

2.1 SRA Toolkit:官方工具集的定位和核心命令

SRA Toolkit是公共数据仓库官方维护的命令行工具包,也算得上是处理.sra文件的标准工具。它不是一个单一程序,而是一组工具,每个工具负责一个环节。

prefetch负责从远程数据仓库下载.sra文件到本地缓存目录。vdb-validate负责校验下载的.sra文件是否完整、未损坏。fasterq-dump和fastq-dump负责把.sra转换成.fastq格式,fasterq-dump是较新的多线程实现,速度明显更快。vdb-config用于配置本地缓存路径和网络参数。

这套工具设计的核心价值在于完全理解SRA格式的内部结构。SRA文件并不是简单的二进制压缩包,它内部有复杂的数据索引和元数据,需要专门的工具读取。用SRA Toolkit下载和转换,能保证数据的一致性和可追溯性。

安装方式比较简单,建议直接用conda安装:conda install -c bioconda sra-tools。二进制工具的大版本差异不大,但如果是老项目,最好固定版本,避免输出格式波动影响下游分析。

2.2 Aspera:高速传输的核心原理和参数逻辑

Aspera使用的传输协议叫FASP,全称Fast and Secure Protocol,它不走传统TCP协议,而是基于UDP来实现大文件的高速传输。传统TCP协议在高延迟和丢包环境里会不断重传,速度呈指数下降;而FASP通过UDP自行实现可靠传输和拥塞控制,能够充分利用带宽。

我在跨境下载动辄几个G的测序数据时,用Aspera的速度通常能跑到几百Mbps,这才算是真正可用的效率。如果用普通FTP或者HTTP,同一种网络条件下可能只有几Mbps到几十Mbps。

Aspera的命令核心是ascp。影响速度的参数主要有几个:

  • -P指定端口,连接公共数据仓库通常用33001;
  • -l设置传输带宽上限,例如-l 500m表示带宽上限设为500Mbps;
  • -i指定私钥文件,一般用Aspera安装目录下的asperaweb_id_dsa.openssh;
  • -k 1开启断点续传,中断后重新执行命令可以从断点继续;
  • -T表示不做加密,纯传输模式,速度更快。

还要注意,ascp命令的远程路径格式不是标准的FTP路径,它在路径前往往会有用户和主机信息,例如用户为anonftp。这个anonftp用户名可以理解为公共匿名下载专用的固定账号,不是需要注册的个人账号。

2.3 两套方案的适用场景对比

我做了个简单的对比表,方便你按场景选方案:

对比维度prefetch + fasterq-dumpAspera直接下载fastq.gz
工具依赖SRA Toolkitascp客户端
下载格式.sra归档格式.fastq.gz直接读取
传输速度普通Http链路,依赖TCPFASP协议,速度更快
格式转换需要本地fasterq-dump转换无需转换
适合场景需要完整归档信息、兼容性优先样本量大、追求速度、直接要fastq
断点续传支持支持
批量脚本简单循环即可需要解析路径规则
数据校验vdb-validatemd5sum手动校验

如果你手头网络条件一般,优先用Aspera。如果只是下载几个小文件,prefetch完全够用。如果追求极致的稳定性和官方一致性,prefetch是更稳妥的选择。

3. 实操过程:用SRA Toolkit下载.sra并转换格式

3.1 prefetch命令的完整执行与参数解释

先用SRA Toolkit里的prefetch下载.sra文件。以一个模拟的RNA-seq样本SRR1039508为例(编号是虚构示例,逻辑一致),命令行如下:

prefetch --max-size 200G SRR1039508

这里有个参数容易被忽略:--max-size。它是用来设置下载的.sra缓存文件最大体积上限。如果一个.sra文件超过这个限制,prefetch会报错。一般建议设置为200G或更大,避免因单文件超过限制导致下载中断。

prefetch默认把.sra文件下载到当前用户的ncbi缓存目录下,通常是~/ncbi/public/sra/。如果空间不够,可以用vdb-config修改缓存路径:

vdb-config --set /repository/user/main/public/root=/data/sra_cache

执行完prefetch后,这是最需要养成习惯的一步:用vdb-validate检查文件完整性。

vdb-validate ~/ncbi/public/sra/SRR1039508.sra

这个命令会检查SRA文件内部结构、索引信息、各个数据块是否完整。输出结果中每项都会显示OK,如果出现missing或failed,说明文件有问题,必须重新下载。

3.2 fasterq-dump转换的核心操作和双端拆分逻辑

.sra文件不能直接用于比对,需要转换成fastq格式。我推荐用fasterq-dump而不是旧版的fastq-dump,原因很简单:fasterq-dump支持多线程,转换速度快得多,而且对磁盘空间的处理也更合理。

转换命令:

fasterq-dump --split-3 --threads 8 --gzip SRR1039508

--split-3参数的含义是自动检测双端测序数据并拆分文件。对于双端测序,输出会生成两个文件:SRR1039508_1.fastq.gz和SRR1039508_2.fastq.gz;单端测序则只生成一个文件。--threads参数设置为8,可以显著加快转换速度。--gzip表示输出时直接压缩成fastq.gz,节省磁盘空间。

转换完成后,用gzip -t分别测试压缩包完整性,再统计序列条数:

gzip -t SRR1039508_1.fastq.gz && echo "R1 OK" gzip -t SRR1039508_2.fastq.gz && echo "R2 OK" zcat SRR1039508_1.fastq.gz | wc -l

注意,序列条数需要除以4才是read数。例如zcat输出的行数是40万行,那么read数就是10万条。这个检查能尽早发现转换后的文件是否异常。

3.3 实际操作中的几个注意点

用SRA Toolkit处理数据时,有一个容易忽略的问题:磁盘空间要按“原始文件 + 转换临时文件 + 最终fastq文件”三份一起估算。fasterq-dump在转换时会生成未压缩的临时fastq文件,体积比压缩后的.gz文件大很多。假设你的.sra是3G,转换过程中可能需要额外5-8G空间,处理完后临时文件会自动删除,但如果磁盘不够,转换会在中途失败。

另外,如果你的目标是直接获得.fastq.gz,也可以考虑官方提供的fasterq-dump加--split-3的简化方式,但别把它当成万能的。有些旧版本的SRA Toolkit对fasterq-dump的并发支持不够完善,遇到大文件时可能卡住,此时升级工具版本或改用fastq-dump加--gzip参数也不失为一种方案。

还有一点,prefetch下载的.sra文件存储在默认缓存目录中,如果之前已下载过同名文件,再次下载时可能需要先删除缓存,否则可能使用缓存中的旧文件。实际操作里我会先查看目录下的文件时间和大小,确认之后再开始。

4. 实操过程:用Aspera直接下载.fastq.gz

4.1 ascp命令的基础用法和密钥配置

Aspera的核心是ascp命令。安装完成后,先确认密钥文件路径是否存在于以下位置:

ls ~/.aspera/connect/etc/asperaweb_id_dsa.openssh

这个密钥文件是公认的公共下载身份凭证,不是你的个人账号密钥。ascp运行时会用它向公共下载服务器完成身份识别。

下载一个.sra文件的完整命令模板如下:

ascp -v -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \ -k 1 -T -l 500m -P 33001 \ anonftp@你的远程主机地址:/路径/SRR1039508.sra \ /本地存放目录/

其中路径规则通常是按SRR编号的层级结构组织的,比如sra/sra-instant/reads/ByRun/sra/SRR/SRR1039508/SRR1039508.sra。如果你不想手动拼路径,可以直接在数据页面获取下载地址,把FTP协议的地址改成Aspera协议的地址格式。

-fastq.gz下载同理,只是远程路径指向的目录是存放fastq文件的开放目录。只要路径正确,从.sra换成.fastq.gz只是改一个路径的事情。

4.2 关键参数的行为逻辑和调优建议

我重点说说几个参数的调优体会。

-T参数是不加密传输。公共下载场景下,数据本身没有敏感信息,不做加密可以省去大量CPU开销,让传输速度更快。我实测下来,同一网络环境,加T和不加T能差出20%到30%的速度。

-l参数是设置带宽上限,单位是bps,500m代表500Mbps。这个值需要根据你实际网络上行下行能力来调整。如果设置的带宽上限超过物理带宽上限,传输会反复拥塞;设得太低则浪费带宽。我第一次使用时设成100m,一个4G的fastq.gz跑了好久,后来改成500m,速度直接提升一大截。

-k 1参数是断点续传。大文件下载很容易因为网络波动中断。有了这个参数,重新执行同样的ascp命令时,工具会检测本地已有文件块,从断点继续传输,而不是从头开始。我的习惯是无论下载什么文件,都会加上k 1。

-P参数是端口号。公共数据服务器的Aspera下载端口通常不是默认的22,而是33001。如果你没有指定-P 33001,连接会失败。这个参数不能漏。

4.3 批量下载脚本和路径拼接经验

单个样本用ascp命令很容易写,但真实项目往往有几十个样本。我会在项目目录里准备一个批量脚本,用for循环批量下载。因为SRR编号的开头几位决定了路径层级,建议先写一个小脚本来解析路径,避免手动拼写路径时出错。

一个合理的批量脚本逻辑是:

for sid in SRR1039508 SRR1039509 SRR1039510; do ascp -v -i ~/.aspera/connect/etc/asperaweb_id_dsa.openssh \ -k 1 -T -l 500m -P 33001 \ "anonftp@远程主机:/sra/.../${sid}/${sid}.sra" \ /data/fastq/ done

如果你想下载的样本比较多,建议把已下载的编号记录到一个文件里,下一次脚本执行时先过滤掉已完成的任务。断点续传虽然可以恢复中断的文件,但更稳妥的做法是准备好一份任务清单,按清单逐个执行。

4.4 完整性校验:md5sum的实际使用

Aspera下载fastq.gz完成后,最好校验文件是否完整。常见做法是比对md5值。先在数据库页面上确认该文件对应的md5值,再到本地执行:

md5sum SRR1039508_1.fastq.gz

由于SRA官方页面通过FTP下载时通常会一并提供.md5文件,所以我下载时会顺手把.md5文件也拉下来,然后执行:

md5sum -c SRR1039508_1.fastq.gz.md5

如果提示OK,说明文件完整。如果提示FAILED,文件必须重传。在批量下载场景下,我还会写一个循环脚本,把所有样本的md5校验结果汇总一下,省得一个个敲命令。

5. 常见问题与排查技巧实录

5.1 prefetch下载异常的几个典型场景

prefetch偶尔会报错提示无法从远程读取数据,有时还会提示文件冲突。我遇到过几次,根因基本是本地缓存有同名但损坏的文件。解决办法是把~/ncbi/public/sra/下对应的.sra文件删掉,重新执行prefetch。

还有一次报错是磁盘空间不足。prefetch在下载过程中会在缓存目录生成部分文件,如果空间不够,下载过程会保持假死状态。建议下载前用df -h检查该目录所在磁盘,预留出至少文件预估体积的1.5倍空间。

还有一个容易被忽视的参数是--max-size。有些老教程会写--max-size 20G,但如果你下载的单个.sra超过20G,就会直接报错。我建议直接设成200G甚至更大,反正它只是一个上限保护,不是预分配。

5.2 fasterq-dump转换时的常见问题

fasterq-dump在转换大文件时,偶尔会卡住不动。多半是因为磁盘上临时文件写满,或者线程数设置过高导致IO瓶颈。遇到这种情况,先按Ctrl+C中断,清理临时目录,再降低线程数重试,比如从8降到4,速度反而会更快。

另一个高频问题是找不到.sra文件。fasterq-dump默认会在当前目录或默认缓存目录里找对应文件。如果你从Aspera把.sra下载到了自定义目录,记得先cd到那个目录,或者用绝对路径指定输入文件。否则会报错找不到文件。

转换后的fastq文件如果不压缩,体积会非常庞大。我的做法是直接用--gzip参数输出压缩格式,而不是先产出fastq再手动gzip。这样节省一步操作,也少了一半峰值磁盘空间。

5.3 Aspera连接失败和速度上不去的原因

Aspera连接失败,最常见的原因就是端口没有指定,默认走22端口,而公共下载服务器用的是33001。这个必须主动指定。

第二个原因是密钥文件路径错误。ascp找不到私钥时会直接退出。我最早踩过的坑是安装Aspera Connect后,密钥文件在GUI安装目录下,而命令行工具用的却是另一份。后来我养成了先执行ls检查密钥,再跑ascp的习惯。

速度上不去的场景也很多。首先确认-l参数是否过低;其次确认路由链路是否稳定;最后观察本机是否同时跑了多个下载任务,多个ascp任务会互相抢占带宽。如果下载大文件需要稳定高速,建议单任务下载,不要开太多并发。

5.4 文件格式认知误区:.sra和.fastq.gz的关系

很多新手会混淆.sra和.fastq.gz。核心区别在于:.sra是数据仓库专用的归档格式,内部除了序列本身,还保留质量分数、测序平台信息、元数据等;fastq.gz是通用测序格式,每一四条记录分别存储序列标识、序列、分隔符和质量分数,用gzip压缩。

.sra体积通常比fastq.gz小,但不是所有下游软件都认得它。我在实际分析中采用的标准流程是:数据从公共数据库下载后先转成fastq.gz,然后进入fastp之类工具做质控。也就是说,.sra只是一个中转格式,最终分析必须用fastq.gz。

5.5 常见问题速查表

问题现象可能原因解决办法
prefetch报错文件超限--max-size设置过小设置为200G并重试
rfastq-dump找不到sra文件路径不在当前目录切换目录或使用绝对路径
ascp连接失败未指定端口或密钥错误加上-P 33001并检查密钥路径
ascp速度极慢带宽上限太低调成-l 500m以上
断点续传无效缺少-k参数命令中加上-k 1
fastq转换后read数不对未按/4计算用zcat管道wc -l统计行数后除以4
md5校验失败文件传输损坏重新下载并再次校验

6. 批量自动化与个人习惯

6.1 从单样本到多样本的脚本化思路

单次下载学会之后,越早脚本化越好。几十个样本的RNA-seq项目,如果一个个手工输命令,既费时又容易出错。

我推荐的脚本写法是准备一个样本编号清单,例如sample_ids.txt,每行一个SRR编号。然后用循环读取并调用prefetch或ascp。核心逻辑很简单:

while read sid; do if [ -s ${sid}.sra.md5 ]; then echo "${sid} already done" continue fi prefetch --max-size 200G ${sid} done < sample_ids.txt

这个if判断用md5标记文件是否存在来判断任务是否完成,能避免重复下载已完成的样本。

不过要注意,脚本和交互式命令的执行环境可能不同,尤其是conda环境变量。建议在脚本开头source激活对应的conda环境,或者直接用绝对路径调用二进制文件。我在服务器上就吃过亏,crontab环境下找不到ascp命令,排查半天发现是PATH环境变量没加载。

6.2 磁盘空间和文件管理的三个习惯

我建议你在项目目录下建立清晰的文件分区。例如:

project/ raw_data/ # 存放下载的.sra或fastq.gz logs/ # 存放下载和转换日志 scripts/ # 存放批量下载和转换脚本 qc/ # 存放质控输出

raw_data和logs分开存放,方便后续重复分析时知道数据是怎么来的。

第三个习惯是及时清理中间文件。下载完成并且转换成功之后,.sra文件如果不再需要,尽早删掉。RNA-seq项目的数据量动不动就几百G,留着.sra只会白白占用存储空间。在集群上做项目时,这一步尤其重要,存储配额往往不够用。

6.3 我在实际操作中积累的几条经验

跑过几次RNA-seq项目之后,我逐渐形成了一套固定的下载习惯。第一,小文件用prefetch,大文件用Aspera。这里的大文件指的是单文件超过5G的情况,Aspera的速度优势在这时才会真正体现出来。第二,能直接下fastq.gz就不要先下.sra再转换,省时省力还少占用磁盘。第三,每次下载完都做完整性校验,不要在未校验的情况下直接开始下游分析,否则质控阶段发现数据坏了,回头重下的成本更高。

第四,也是最重要的:下载前先看数据规模和样本数量,评估好网络传输时间和磁盘空间,再决定是用交互式屏幕还是后台nohup执行。大项目我一般用nohup让脚本在后台运行,并把输出重定向到日志文件,第二天检查日志和文件大小就知道有没有跑完。

6.4 这个下载流程后续还能怎么扩展

这套下载体系不仅适用于RNA-seq,也适用于其他类型的测序数据下载,比如全基因组测序、全外显子测序、单细胞测序。只要是公共测序仓库里的SRR编号数据,方法论完全一致。

如果有条件,也可以把下载和质控做成一个流水线脚本,下载完成后自动跑fastp质控,生成质控报告。这样数据的获取和分析就打通了,拿到fastq.gz之后可以直接进入下一阶段。不过这一步属于后话,等文章末尾再继续扩展也不迟。

我现在回顾整个流程,最深的感受是:数据下载这件事看似简单,但恰恰是很多项目前期最耗时的一环。工具选对了,几个小时的活可能十几分钟就搞定;选错了,几十个小时耗在里面都正常。用Aspera搭配SRA Toolkit组合使用,基本能覆盖绝大多数公共测序数据下载的场景,再配合断点续传和完整性校验,整个流程就会变得比较可靠。希望这篇笔记对正在搞RNA-seq的你也有参考价值。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进