数据库构建:Kraken2的RefSeq/Standard库
说实话,Kraken2 的数据库构建是整个分析流程里最“粗活”的一步。但你想想看,数据库搭得好,后面的分类才会准。很多新手图省事直接拿现成库跑,结果撞上存储不够或者跑崩了——嗯,我当年也踩过这个坑,所以今天把这章好好掰扯清楚。
数据库到底长什么样?
Kraken2 数据库本质上是一棵巨大的、带 k-mer 索引的树。每个节点代表一个分类单元(界门纲目科属种),叶子节点就是具体序列。数据来源主要是 NCBI 的 RefSeq 数据库,也包含一部分 GenBank 数据。
标准库(Standard)包含的东西:
- 细菌、古菌、病毒、真核生物(部分)
- 人基因组序列(用于过滤宿主污染)
- 质粒、叶绿体、线粒体等小基因组
关键产出文件:
hash.k2d— k-mer 哈希表,分类的主干opts.k2d— 构建参数配置taxo.k2d— 分类树节点映射seqid2taxid.map— 序列 ID 到分类 ID 的映射
搭建步骤:从零开始
我习惯先准备好一个干净的目录,把数据库单独放。以下是一套完整命令:
# 1. 设置环境变量
export KRAKEN2_DB_PATH=/data/kraken2_db
# 2. 下载分类信息(可能需要 sudo 或 chmod)
kraken2-build --download-taxonomy --db $KRAKEN2_DB_PATH
# 3. 下载你要的序列库,比如 Standard
kraken2-build --download-library bacteria --db $KRAKEN2_DB_PATH
kraken2-build --download-library viral --db $KRAKEN2_DB_PATH
kraken2-build --download-library human --db $KRAKEN2_DB_PATH
# 4. 构建索引(最耗内存和CPU)
kraken2-build --build --db $KRAKEN2_DB_PATH --threads 24
曾经我遇到过的坑: 下载过程中网络断开,文件不完整。后来我每次都用 --download-progress 参数,或者干脆写个脚本做重试。还有,--build 那步对内存需求巨大(Standard库至少需要 130GB RAM),我在16GB笔记本上跑直接 OOM 了。建议至少 64GB 以上内存。
核心参数:怎么调才科学
| 参数 | 默认值 | 作用 | 我的建议 |
|---|---|---|---|
--kmer-len | 31 | k-mer 长度 | 31 适合大多数;35 能提升特异性但耗内存 |
--minimizer-len | 15 | 最小化值长度 | 自动推导,一般不用改 |
--minimizer-spaces | 7 | 最小化值间隔种子 | 保持默认 |
--minimum-hit-groups | 2 | 最少 hit 组数(分类时用) | 这是分类时的参数;构建时无效 |
--clean | 否 | 构建后删除临时文件 | 如果不差空间可以保留,方便调试 |
小技巧: 如果你只需要细菌和病毒,别下载完整的真核生物库。我做过一个对比:只下载 bacteria + viral 的库大小约 80GB,而 Standard 完整版能到 120GB+。内存不够时可以按照 文档用 --exclude 参数剔除不需要的类群。
定制你的专属库
项目里经常会遇到一些特殊需求,比如需要加入本地菌株基因组。Kraken2 提供了灵活的自定义方式:
# 添加自定义序列(FASTA 格式)
kraken2-build --add-to-library my_strain.fa --db $KRAKEN2_DB_PATH
# 删除某个类群(比如不需要古菌)
kraken2-build --remove-from-library archaea --db $KRAKEN2_DB_PATH
# 最后重新构建
kraken2-build --build --db $KRAKEN2_DB_PATH
注意: 自定义序列必须带有标准的 NCBI 分类 ID(在 fasta 头部 >gi|xxx|ref|XXX| 格式里)。我见过同事直接把普通 fasta 头塞进去,结果构建报错找不到分类。半分钟搞定的事,能省就别省。
存储与维护
数据库不是建成就能一劳永逸的。NCBI 的 RefSeq 每季度更新,旧版本可能漏掉新发表的基因组。我的做法是每年夏天重新构建一次,同时保留上一版用于对比。
磁盘空间参考:
- Standard 完整库:约 120GB(构建过程临时文件翻倍)
- 只细菌+病毒:约 80GB
- 自定义小库(比如只有病原菌):10GB 以内
另外,构建过程会产生大量中间文件,记得设置 --clean 或者在结束后手动删除 library/ 和 taxonomy/ 目录下的临时文件。我习惯在构建脚本最后加一句:
# 只保留必要的索引文件,其余删掉
rm -rf $KRAKEN2_DB_PATH/library
rm -rf $KRAKEN2_DB_PATH/taxonomy
# 但保留 library.fna 让后续可追溯
重要: 如果你在超算集群上跑,务必检查文件系统配额。我曾经因为 /tmp 满了导致构建异常退出,后来我把临时目录指向了更大的 $TMPDIR。
避坑总结
- 内存不足: 84GB 以下机器不要尝试 Standard 库;可以考虑用
--max-table-size限制哈希表大小(但会牺牲敏感度) - 网络问题: 下载分类库时
--download-progress或使用系统代理 - 版本不兼容: Kraken2 v2.1.x 构建的数据库不能被 v2.0.x 使用,保持版本一致
- 权限问题: 数据库目录必须可写;常见错误是 root 用户下载后普通用户无法使用