数据库构建:Kraken2的RefSeq/Standard库

说实话,Kraken2 的数据库构建是整个分析流程里最“粗活”的一步。但你想想看,数据库搭得好,后面的分类才会准。很多新手图省事直接拿现成库跑,结果撞上存储不够或者跑崩了——嗯,我当年也踩过这个坑,所以今天把这章好好掰扯清楚。

数据库到底长什么样?

Kraken2 数据库本质上是一棵巨大的、带 k-mer 索引的树。每个节点代表一个分类单元(界门纲目科属种),叶子节点就是具体序列。数据来源主要是 NCBI 的 RefSeq 数据库,也包含一部分 GenBank 数据。

标准库(Standard)包含的东西:

  • 细菌、古菌、病毒、真核生物(部分)
  • 人基因组序列(用于过滤宿主污染)
  • 质粒、叶绿体、线粒体等小基因组
Kraken2 标准数据库构建流程 RefSeq + GenBank kraken2-build --download --db 库名 --taxonomy kraken2-build --build hash.k2d / opts.k2d / taxo.k2d + 索引文件 + 分类信息

关键产出文件:

  • 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-len31k-mer 长度31 适合大多数;35 能提升特异性但耗内存
--minimizer-len15最小化值长度自动推导,一般不用改
--minimizer-spaces7最小化值间隔种子保持默认
--minimum-hit-groups2最少 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 用户下载后普通用户无法使用