数据库概述:Kraken2标准数据库与自定义数据库

在开始搞特征提取之前,咱们得先把数据库这关过了。说白了,Kraken2不像你跑个单机软件随便写个路径就行——它的核心就是靠数据库来匹配k-mer。数据库选不对,后面所有分析都是废的。今天我就把这部分掰开了讲,主要聊两个方向:现成的标准数据库,还有你自己动手搭的自定义数据库。

4.1 标准数据库:开箱即用但别盲选

Kraken2官方维护了几套预构建的标准数据库,最常见的就是Plus、Minus、Viral这三个。很多新手上来就无脑下Plus,项目跑完发现占用几百G硬盘,这其实挺浪费的。我个人习惯是,先想清楚样本里可能有哪些物种,再挑库。

数据库名称 包含范围 库大小(约) 适用场景
Plus 细菌+古菌+病毒+人类 ~80 GB 临床微生物、人源样本
Minus 细菌+古菌+病毒(排除人类) ~60 GB 环境样本、低宿主污染
Viral 病毒完整基因组 ~4 GB 病毒宏基因组富集
Standard(已废弃) 细菌+古菌+病毒 ~70 GB 旧版本兼容,不建议再用

为什么要排除人类基因组?想想看,如果你测的是肠道菌群,样本里90%都是人源序列,你花大量算力去比对人类DNA,最后特征提取里全是宿主噪声。我曾经就踩过这个坑——第一次跑全基因组测序数据,没设置filter,结果Kraken2报告里99%都匹配到人,相当于白跑。从那次之后,除非明确需要检测人类病毒整合,否则我都用Minus库。

标准数据库的下载很简单,但有几个坑你得注意:

# 下载Plus库(大约需要40分钟,取决于网速)
kraken2-build --download-taxonomy --db Plus
kraken2-build --download-library bacteria --db Plus
kraken2-build --download-library archaea --db Plus
kraken2-build --download-library viral --db Plus
kraken2-build --download-library human --db Plus
kraken2-build --build --db Plus

# 或者直接用预构建包(推荐,省时间)
wget https://genome-idx.s3.amazonaws.com/kraken/k2_plus_20240605.tar.gz
tar -xzf k2_plus_20240605.tar.gz -C ./k2_plus

注意:预构建包的版本号每天都在变。下载前一定要去Ben Langmead的官方Github Releases页面确认最新的可用版本。我上个月就因为这个链接写死了,下载了个过期的库,后来推倒重来浪费了俩小时。

数据库建好之后,你会看到一坨文件:hash.k2d、opts.k2d、taxo.k2d。这三个文件一起构成Kraken2需要的索引。记得别手贱删掉其中任何一个,它们互相依赖。

4.2 自定义数据库:当标准库满足不了你的时候

标准数据库虽然方便,但你总有特化需求。比如我做的某个植物病原菌检测项目,标准库里根本没有目标物种的完整基因组,只有几个近缘种——结果Kraken2分类全跑到属一级,根本拿不到种级特征。这时候就必须自己搭数据库。

自定义数据库的构建流程大致分三步:

  1. 收集参考基因组FASTA——从NCBI RefSeq/GenBank按你想要的物种拉下来。
  2. 整理分类学ID——每个FASTA文件必须关联正确的taxid,否则Kraken2无法分配分类。
  3. 运行kraken2-build构建索引——这一步最耗内存,建议至少64GB RAM。

具体命令长这样:

# 1. 创建自定义库目录
mkdir -p my_custom_db/library
cd my_custom_db

# 2. 下载NCBI分类信息(必须做!)
kraken2-build --download-taxonomy --db .

# 3. 把你准备好的FASTA放到library/下
# 每个序列头格式必须是:>kraken:taxid|12345 序列描述
# 例如:>kraken:taxid|562 Escherichia coli str. K12

# 4. 把FASTA添加到库
kraken2-build --add-to-library library/ecoli.fa --db .

# 5. 对所有你想加的物种重复上一步
# 6. 最后构建索引
kraken2-build --build --db . --threads 8

小技巧:在添加FASTA之前,先检查序列头格式。很多人直接从NCBI下载的GenBank记录是默认描述行,需要手动改写。我一般写个简单的Python脚本来批量替换:

#!/usr/bin/env python3
import gzip, re

def fix_fasta_header(input_fa, output_fa, taxid):
    with gzip.open(input_fa, 'rt') if input_fa.endswith('.gz') else open(input_fa) as f_in:
        with open(output_fa, 'w') as f_out:
            for line in f_in:
                if line.startswith('>'):
                    # 提取第一个空格之前的序列ID
                    seq_id = line.split()[0][1:]
                    new_header = f">kraken:taxid|{taxid}|{seq_id}\n"
                    f_out.write(new_header)
                else:
                    f_out.write(line)

fix_fasta_header('GCF_000005845.2.fna.gz', 'ecoli.fa', 562)

自定义库里还有一个容易翻车的地方:分类树的完整性。Kraken2在做分类时,必须从你提供的taxid沿整个分类路径反推到根节点。如果你只加了细菌属的taxid,但没下全NCBI的分类信息,Kraken2会报错。我的解决方法是:每次构建自定义库时,都用`kraken2-build --download-taxonomy`下载完整分类信息,不要只下载你需要的子集。

4.3 数据库大小与内存的黄金比例

Kraken2有个让人头疼的特性:它会将整个数据库的哈希索引加载到内存中。数据库文件多大,内存占用就差不多那么大。Plus库80GB,你至少需要96GB内存才比较稳妥(留点余量给系统和k-mer扫描线程)。

但别以为内存越大越好。我试过在256GB的机器上跑,Kraken2本身并不会利用额外内存做缓存,单纯浪费。所以规划服务器资源时,你可以按这个公式估算:

数据库大小 建议最小内存 推荐线程数
< 10 GB(Viral、小型自定义) 16 GB 8-16
10-50 GB(Minus、中型自定义) 64 GB 16-32
> 50 GB(Plus、大型自定义) 96 GB 32-64

核心观点:不要为了追求高分类分辨率把数据库做得过大。Kraken2的敏感度和数据库大小不是线性关系——加太多冗余基因组反而会增加错配。我习惯把每个物种只放一个代表性基因组,除非你明确需要区分不同株系。

4.4 数据库构建的避坑指南

最后集中说一下我这些年碰到的几个典型坑:

  • 坑一:FASTA里混入N碱基过多的序列。Kraken2对N的处理是直接跳过,但如果一条序列里N比例超过20%,它几乎无法提取任何有效k-mer。我建议先用工具过滤low-complexity序列。
  • 坑二:重复添加同一个基因组。如果你不小心把同一个FASTA添加两次,Kraken2构建索引时不会报错,但会导致某个k-mer被多次计数,影响分类概率。建库前先对FASTA文件名做去重,或者用`md5sum`校验。
  • 坑三:分类ID版本冲突。不同来源的基因组可能用了不同版本的NCBI taxonomy(比如旧版taxid已经合并或分裂)。我每次都会用`kraken2-inspect`检查新自定义库的分类树是否合理。

警告:构建自定义库时,如果跳过`--download-taxonomy`直接用本地提供的taxonomy文件,你可能会遇到“Invalid taxonomic ID”错误。解决方法是重新执行完整的分类下载命令,不要偷懒复制别人机器上的nodes.dmp和names.dmp——因为不同机器的数据库版本可能不一致。

好了,关于标准库和自定义库的核心内容就到这。下面我把整个选择逻辑画成一张图,方便你以后直接对照着用。

Kraken2数据库选择与构建流程 Kraken2数据库选择与构建决策流 样本类型? 常见/人源样本 Plus 标准库 环境/无宿主 Minus 标准库 覆盖目标物种? 覆盖目标物种? 是 → 直接使用 否 → 构建自定义库 1. 下载分类信息 + 收集FASTA

这张图的核心逻辑其实很简单:先看你的样本有没有大量宿主污染,再判断标准库是否足够。如果都不符合,那就老老实实走自定义路线。我自己的经验是,至少一半的项目最后还是得定制数据库——尤其是做稀有物种、植物病原菌、昆虫共生菌这类冷门领域的,标准库基本覆盖不到。