第3章 宏基因组数据获取:公共数据库下载与本地管理
做宏基因组分析,第一步就是搞到数据。你想想看,没数据咱分析啥?公共数据库 SRA 和 ENA 就是最常用的两个来源。我个人习惯先把数据拉到本地,再按统一规范管理,这样后面跑流程时才不会手忙脚乱。这一章我就带你走一遍从数据库到本地文件夹的全过程。
3.1 两大公共数据库概览
SRA(Sequence Read Archive)由 NCBI 维护,ENA(European Nucleotide Archive)由 EBI 维护。说白了,只要你的样品测了序,基本都会提交到这两个库里。它们的数据是互通的,但下载接口和格式略有不同。
| 特性 | SRA (NCBI) | ENA (EBI) |
|---|---|---|
| 数据层级 | BioProject → BioSample → Run → SRA file | Project → Sample → Experiment → Run |
| 常用下载工具 | prefetch, fasterq-dump | curl, ascp (Aspera), enaBrowserTools |
| 下载格式 | .sra (需转换) 或直接 .fastq | .fastq.gz 可直接使用 |
| 速度 | 普通HTTP,可用aspera加速 | 提供FTP与aspera,速度较快 |
3.2 SRA 数据下载:sra-toolkit 实战
先安装 sra-toolkit。我记得第一次装的时候踩了个坑——环境变量没配好,prefetch 找不到数据库路径。后来我写了个小脚本自动配置,现在分享给你。
安装与配置
# 下载并解压(以 Linux 为例)
wget https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/3.0.0/sratoolkit.3.0.0-ubuntu64.tar.gz
tar -xzf sratoolkit.3.0.0-ubuntu64.tar.gz
# 添加环境变量
export PATH=$PATH:/path/to/sratoolkit.3.0.0-ubuntu64/bin
# 配置缓存目录(默认在 home 下,建议改到大分区)
vdb-config -i
运行 vdb-config -i 后会弹出交互界面,把 cache 路径改成你的数据盘,比如 /data/sra_cache。为什么要改?我碰见过 home 分区被 prefetch 的临时文件撑爆,半夜跑任务崩了,气得不行。
下载单个 Run
prefetch SRR12345678
默认会下载到 $HOME/ncbi/public/sra/,如果你改了配置就到指定目录。下载完后得到一个 .sra 文件,需要转成 FASTQ 才能用。
转换成 FASTQ
fasterq-dump --split-files SRR12345678 -O /data/fastq/
参数 --split-files 会把双端测序拆成两个文件,单端测序只生成一个。我记得有个项目,样品是双端但提交时标记成了单端,结果 fasterq-dump 只出一个文件,还好我习惯先检查一下 read 数目。建议拿到数据后先看一眼 seqkit stats 的统计结果。
--threads 4 --mem-limit 4096 限制资源。否则 OOM 让你怀疑人生。
批量下载与重命名
实际项目中往往有一份样本清单。写个循环就行:
cat SRR_Acc_List.txt | while read srr; do
prefetch $srr
fasterq-dump $srr -O /data/project/fastq/ --split-files
done
不过我会在每个 fasterq-dump 后面加一个 sleep 2,防止同时写硬盘造成 IO 风暴。
3.3 ENA 数据下载:轻量级方案
ENA 提供的是 .fastq.gz 的直链,有些场景下更方便。举个例子,你只需要几十个样本,用 curl 一行命令就能搞定。
通过 FTP 下载
wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR123/001/SRR12345678/SRR12345678.fastq.gz
但这种写法你得自己拼 URL。我发现 ENA 有个 API 可以把 Run ID 转成下载链接:
curl -s "https://www.ebi.ac.uk/ena/portal/api/filereport?accession=SRR12345678&result=read_run&fields=fastq_ftp" | \
cut -f2 | tr ';' '\n'
输出结果直接就是可用的下载地址。把这个地址扔给 wget -c 就能断点续传。
使用 Aspera 加速
当数据量上百 GB 时,HTTP 会很慢。ENA 支持 Aspera,速度能快 5-10 倍。前提是装好 ascp(IBM Aspera Connect)。
ascp -QT -l 300M -P33001 \
era-fasp@fasp.sra.ebi.ac.uk:/vol1/fastq/SRR123/001/SRR12345678/SRR12345678.fastq.gz \
/data/project/fastq/
这里 -l 300M 限速 300 Mbps,别把公司带宽占满了。我记得有一次我没加 -Q(自适应传输),结果上传方把我连接断掉了……加上这个参数能避免。
3.4 本地测序数据管理规范
数据下载回来只是开始,怎么管理才是关键。我见过有人把几百个样本的 FASTQ 全扔在一个文件夹里,文件名还都是 SRR 号。等到分析的时候,连哪个是哪个都分不清。后来我自己定了一套命名和管理规范,趟过了不少坑。
目录结构示例
/data/project_2024/
├── 00_reference/ # 参考基因组、索引
├── 01_raw_data/ # 原始 FASTQ
│ ├── Sample_A/
│ │ ├── Sample_A_R1.fastq.gz
│ │ └── Sample_A_R2.fastq.gz
│ └── Sample_B/
│ ├── Sample_B_R1.fastq.gz
│ └── Sample_B_R2.fastq.gz
├── 02_trimmed/ # 质控后数据
├── 03_assembly/ # 组装结果
├── 04_binning/ # 分箱结果
├── logs/ # 运行日志
└── md5sum.txt # 所有文件的校验和
注意我用了 Sample_A 而不是 SRR12345678。为什么?因为同一个样本可能有多个 Run,或者后来重新测了序。第一次不把名字映射好,后面几个月你根本记不住。
建立样品映射表
我习惯用一个 CSV 记录所有元信息:
sample_id,run_id,platform,instrument,read_type
Sample_A,SRR12345678,Illumina,NovaSeq 6000,PE150
Sample_A,SRR12345679,Illumina,NovaSeq 6000,PE150
Sample_B,SRR23456789,Illumina,MiSeq,PE250
这样你写下游脚本时只需要解析这张表,而不是去猜测文件名。我一般会把这张表放在项目根目录的 metadata.csv 里,并加入 Git 版本管理(数据当然不 track,只 track 脚本和 metadata)。
md5sum 生成校验文件,并上传到云存储备份。以前吃过亏:跑了三天分析,结果发现 FASTQ 在下载时被截断了,血泪教训。
3.5 实战演练:下载一个宏基因组样本
咱们动手走一遍。我用的是 NCBI 上一个人肠道宏基因组样本 SRR12345678(虚构 ID,实际请替换成真实 Run)。
-
确认 Accession
在 NCBI SRA 页面查到 BioSample 和 Run ID。我一般会复制 Run ID,同时记下测序平台和 read 长度。 -
配置 sra-toolkit 缓存路径
执行vdb-config -i把 cache 指向大容量分区。 - 下载 .sra 文件
prefetch SRR12345678
- 转 FASTQ 并存放到规范目录
mkdir -p /data/project/01_raw_data/HumanGut_1
fasterq-dump SRR12345678 -O /data/project/01_raw_data/HumanGut_1/ --split-files
gzip /data/project/01_raw_data/HumanGut_1/*.fastq
-
校验完整性
用seqkit stats检查 read 条数,并与 SRA 页面上的数量对比。
seqkit stats /data/project/01_raw_data/HumanGut_1/*.fastq.gz
输出里会显示 num_seqs,如果跟 SRA 记录的 Spot 数不一致,那就重新下载吧。
好了,现在你的原始数据安安稳稳躺在本地文件夹里,名字清晰、结构规范。下一步就是做质控了,不过那是下一章的内容。咱们先把数据获取这块的基础打牢。
seqkit sample -p 0.001 抽个千分之一的子集,快速跑一下质控和初版流程,确认数据没问题再全量下载。这样即使下载出错了,损失也很小。