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 越多,分类证据越强。
核心思想二: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 的安装不算复杂。你可以从 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 的适用场景
结合它的原理,你可以判断什么时候该用它:
- 快速初筛:几十个样本,每个几百万条 reads,想先看看大致物种组成。Kraken2 几分钟就能出报告。
- 已知物种鉴定:数据库里有充分的参考基因组(比如临床病原菌、肠道微生物)。
- 数据量巨大:超过 1 亿条 reads,用 BLAST 或金标准(如 BWA + 人工整理)会跑死人。
但要注意,Kraken2 对新物种或高度变异区域表现一般。因为它是精确匹配,无法容忍错配或插入缺失。如果测序质量差(Q < 20),假阴性会高。这时候可以搭配 Bracken 做丰度重估,或者改用 MetaPhlAn(下章会讲)。
核心总结
Kraken2 = k-mer 精确匹配 + LCA 后处理 + 内存优化。
优点:快、省内存、安装简单。
局限:不能处理序列变异,依赖数据库质量。
如果你只是想快速了解一个样本里“可能有哪些微生物”,Kraken2 是最省心的选择。