Kraken2 简介:历史、发展、核心思想

如果你做过宏基因组物种分类,多半听过 Kraken 这个名字。它速度快,原理简单,而且准确率不差。我今天就跟你聊聊 Kraken2 是怎么来的,它到底靠什么做分类,以及我用它踩过哪些坑。

从 Kraken 到 Kraken2:一段不算长的进化史

Kraken 最早是 2014 年由 Johns Hopkins 的 Derrick Wood 团队发布的。那时候大家还在用 BLAST 或 Bowtie 搭流程,跑完一个样本要好几个小时。Kraken 提出了一个大胆的想法——直接用精确的 k-mer 匹配,结合 LCA 算法,把分类速度提到了分钟级。

我记得第一次跑 Kraken 1,看到它几秒读完 10M 条 reads,我都愣住了。但后来发现,它的内存消耗确实大。运行时间虽然快,但建库阶段内存直接干到 100 GB 以上,普通服务器根本扛不住。

2019 年,Kraken2 出来了。它做了两个关键改进:

  • 改用 spaced seeds 索引。原本 Kraken 1 用长度为 L 的 k-mer,Kraken2 用了“间隔种子”——只匹配其中部分位置。这能大幅压缩索引体积。
  • 引入 compact hash table 和 minimizer 策略。建库时只存最小 minimizer 的哈希值,而不是完整的 k-mer 序列。这一下把内存降低了 5-8 倍。

说白了,Kraken2 保留了 Kraken 1 的“精髓”——k-mer 精确匹配 + LCA 分类,但把它变得更省内存、更易部署。现在一台 64 GB 内存的机器就能跑默认数据库,这在以前想都不敢想。

核心思想一:k-mer 匹配——让短序列“按图索骥”

分类的本质是什么?是拿你测出来的短序列(reads)跟参考基因组比对,看看它可能来自哪个物种。Kraken2 怎么做?把参考基因组切碎成很多很多长度一样的短片段——k-mer。

比如你有一株大肠杆菌的基因组,长度约 5 Mb。Kraken2 会用长度为 31 bp 的 k-mer 把它切成大约 500 万个片段(5,000,000 - 31 + 1),然后统统存进哈希表。建库时还会做 LCA 标注:如果某个 k-mer 同时出现在多个物种里(比如保守区),那这个 k-mer 就归到它们最近共同祖先节点。

实际分析时,Kraken2 会把你的每条 reads 也切成 k-mer,去哈希表里查。命中的 k-mer 越多,分类证据越强。

个人经验:k-mer 长度直接影响灵敏度和特异度。Kraken2 默认是 31 bp,我觉得大部分非模式细菌都够用。如果你在做高度保守的 16S 区域,可以考虑调到 25 缩短,减少假阳性。但别设太短(比如 19),否则哈希表几乎全是一对多的匹配,分类结果一团糟。

核心思想二:LCA 分类——解决“一个 k-mer 属于多个物种”

你想,一个长度为 31 的 k-mer 在很多近缘物种里是完全一样的。那 Kraken2 该把它分配给谁?Kraken2 的做法是向上追溯:找到包含所有这些物种的最小分类阶层(最近共同祖先),然后把这个 k-mer 标注到这个 LCA 节点。

举个简单的例子:假设某个 k-mer 既出现在大肠杆菌里,也出现在沙门氏菌里。大肠杆菌和沙门氏菌都属于肠杆菌科。那么 Kraken2 就把这个 k-mer 标记为“肠杆菌科”。匹配到这个 k-mer 的 reads,会获得一枚“肠杆菌科”的票。

投票完成后,Kraken2 统计每条 reads 的所有 k-mer 票数。票数最多的分类阶层,就是这条 reads 的最终分类。如果是“门”级别票数最多,就归到门;如果是“属”级别最多,就归到属。

曾经踩过的坑:我有一年给一个土壤样本跑 Kraken2,发现结果显示好多“k__Bacteria(界)”,再往下全是未分类。我以为是数据库的问题。后来检查才发现我建库时用了 NCBI 的 nr 库,里面很多序列注释不全,LCA 直接退到了界。正确做法是用 RefSeq 完整基因组库,或者自己过滤低质量序列。

工具安装与基本用法

Kraken2 的安装不算复杂。你可以从 GitHub 克隆编译,也可以用 conda 直接安装。我个人更推荐 conda,因为依赖环境一次搞定。

conda create -n kraken2 -c bioconda kraken2
conda activate kraken2

安装完以后,你需要下载或构建分类数据库。Kraken2 官方提供了预建库(Standard、PlusPF 等),直接用 kraken2-build 下载即用:

kraken2-build --standard --db $DBNAME

这个命令会从 NCBI 拉取细菌、古菌、病毒和人类参考基因组,构建成索引。注意:标准库大概需要 60-80 GB 磁盘空间和 12-16 GB 内存才能构建,跑分类时消耗约 10 GB 内存。

如果你只想跑分析,可以直接用我预建好的数据库文件(.k2d 格式):

# 假设数据库已经放在 /data/kraken2_db
kraken2 --db /data/kraken2_db --output output.kraken sample.fastq

# 加上 --report 可以生成汇总报告
kraken2 --db /data/kraken2_db \
        --output output.kraken \
        --report output.report \
        sample.fastq

输出文件里每行对应一条 reads,包含分类 ID、名称、匹配信息等。report 文件则给出每个分类节点上的 reads 数量和比例。

Kraken1 与 Kraken2 的核心差异

特性 Kraken1 Kraken2
索引策略 完整 k-mer 哈希表 Minimizer + Compact hash table
k-mer 匹配方式 精确匹配(连续) 精确匹配(spaced seeds)
建库内存需求 100+ GB(标准库) 12-16 GB
分类速度 4-5 million reads/min 4-5 million reads/min(相近)
分类精度(通用) 基线 近似持平,略优
数据库更新 手动下载 + 构建 kraken2-build 一键

一张图看清 Kraken2 工作流

Kraken2 工作流程 参考基因组 k-mer 分块 (31bp) 含 minimizer 哈希 k-mer → LCA 节点 哈希表 (Compact hash) 输入 reads k-mer 精确匹配 + 投票 统计每条 reads 各分类票数 分类结果(.kraken + .report)

Kraken2 的适用场景

结合它的原理,你可以判断什么时候该用它:

  • 快速初筛:几十个样本,每个几百万条 reads,想先看看大致物种组成。Kraken2 几分钟就能出报告。
  • 已知物种鉴定:数据库里有充分的参考基因组(比如临床病原菌、肠道微生物)。
  • 数据量巨大:超过 1 亿条 reads,用 BLAST 或金标准(如 BWA + 人工整理)会跑死人。

但要注意,Kraken2 对新物种或高度变异区域表现一般。因为它是精确匹配,无法容忍错配或插入缺失。如果测序质量差(Q < 20),假阴性会高。这时候可以搭配 Bracken 做丰度重估,或者改用 MetaPhlAn(下章会讲)。

核心总结

Kraken2 = k-mer 精确匹配 + LCA 后处理 + 内存优化。

优点:快、省内存、安装简单。

局限:不能处理序列变异,依赖数据库质量。

如果你只是想快速了解一个样本里“可能有哪些微生物”,Kraken2 是最省心的选择。