2. BLAST使用方法:命令行操作、参数详解、输入输出格式、本地BLAST安装与配置

BLAST 这东西,说白了就是序列比对领域的瑞士军刀。我刚开始搞生信的时候,总觉得它就是个黑盒子——扔一条序列进去,出来一堆结果,也不知道中间发生了什么。后来在 GPU 集群上调 BLAST 任务,才真正摸透了它的脾气。这一章,我就把本地 BLAST 的安装、参数、输入输出这些基础操作,掰开揉碎了讲一遍。

BLAST 命令行工作流 输入 FASTA 选择程序 数据库路径 核心参数 输出格式 运行与解析 结果文件 提示:每个节点对应一个命令行参数或步骤,缺一不可。

2.1 本地 BLAST 安装与配置

NCBI BLAST+ 是目前最主流的本地版。我个人习惯用 conda 装,干净省事。当然,你也可以去 NCBI ftp 下载预编译包。

安装命令(conda 环境):
conda create -n blast_env blast
conda activate blast_env
which blastn

我记得第一次在红帽集群上装 BLAST,没留意 glibc 版本,结果跑起来一堆段错误。后来老老实实下载静态编译版才消停。

装好后,配置环境变量和数据库路径是关键。很多新手会忽略这一步,结果每次都要打全路径。

个人建议:在 ~/.bashrc 里加一行:
export BLASTDB=/data/ncbi/nt
这样 BLAST 会自动去那个目录找数据库,省得每次都写 -db 全路径。

数据库格式化成 BLAST 索引也经常踩坑。比如从 NCBI 下载的 nt 压缩包,需要先用 makeblastdb 处理才行。

makeblastdb -in nt.fasta -dbtype nucl -parse_seqids -out /data/ncbi/nt
我曾经遇到一个案例:集群上好多用户共享一个数据库目录,但有人用 chmod 把权限搞乱了,结果所有 BLAST 任务都报权限错误。一定要统一管理 $BLASTDB 目录的读写权限。

2.2 命令行操作与参数详解

BLAST 的命令行结构其实很简单:

blastn -query myseq.fa -db nt -out results.txt -outfmt 6 -num_threads 4

你想想看,核心就是三个要素:查询序列(-query)、数据库(-db)、输出(-out)。剩下的参数都是在控制「怎么比」和「怎么出」。下面这张表是我在实际项目中经常调整的参数。

参数说明常用值 / 示例我的经验
-evalue期望值阈值1e-5一开始别设太严,1e-3 看看概貌
-num_threads线程数4, 8, 16不是越多越好,超过物理核数反而变慢
-outfmt输出格式0~18集群任务我几乎只用 6 或 7
-max_target_seqs最多目标序列数100设太小可能漏掉同源,设太大输出文件膨胀
-word_size种子词长11(blastn默认)调大能加快但可能漏敏感匹配

这里特别提一下 -outfmt。默认的成对比对输出(格式 0)在终端看看还行,但你要做下游分析或者批量跑,那就是灾难。我习惯用制表符分隔的格式:

-outfmt "6 qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore"

这样每一列清清楚楚,用 awk 或 pandas 都能直接读。因为工作需要,我还会加 sseq 列(格式 7 带注释)来快速确认序列内容。

一个小技巧:如果数据库很大,记得加 -lcase_masking 配合 -soft_masking true,能避免低复杂度区域的假阳性。我在做宏基因组比对时,这个开关救过我不少次。

2.3 输入输出格式

BLAST 的输入只有一条:FASTA 格式。很多生信工具都支持 FASTA,但 BLAST 对格式要求很严格——序列行不能有空格,描述行以 > 开头。我见过有人把多行序列合并成一行,结果 BLAST 直接报错。

正确的 FASTA 示例:

>query1 some description
ATCGATCGATCG
TACGATCGATCG
>query2
GGCCGGCCGGCC

输出格式上,我重点讲三种最常用的:

  • 格式 0(默认):成对比对详情,带排版,适合人类阅读,但是解析起来很恶心。
  • 格式 6(制表符分隔):每行一条比对,列数可定制。我 90% 的情况都用它。
  • 格式 5(XML):结构化的,适合程序处理。但是文件体积大,解析也慢,除非做二次开发,否则不推荐。

举个实际输出例子(格式 6,截取部分):

query1	NC_000001.11	99.8	1500	3	0	1	1500	1000	2499	2e-10	789.0
query1	NC_000002.12	85.2	1450	215	2	1	1450	500	1949	3e-04	650.1

每列的含义分别是:查询ID、目标ID、相似度百分比、比对长度、错配数、缺口数、查询起止、目标起止、E值、比特分。

2.4 实战避坑指南

这部分是我真正想分享的。纸上谈兵没用,咱们直接看几个常见问题。

  1. 数据库索引损坏:如果报 BLAST Database error,多半是 makeblastdb 时没加 -parse_seqids,或者索引文字路径不对。用 blastdbcmd -db nt -info 检测一下。
  2. 线程调优:在 HPC 节点上,不要一股脑给满所有核。因为 BLAST 内部有 I/O 瓶颈,我测试过,NGS 数据和 8 核时性价比最高。
  3. 内存不足:如果用 -outfmt 5 XML 输出一个大库,内存会暴涨。建议要么限制 -max_target_seqs,要么换格式 6。
  4. 非标准字符:FASTA 序列里不能有 * - 等非核酸/氨基酸字符,否则 BLAST 会跳过整条序列。写脚本做一次清洗很必要。
我曾经接到一个紧急求助:有个同事跑了三天 BLAST,结果全是空文件。最后发现他误把 -outfmt 写成了 -outform,BLAST 直接忽略了那个参数,用了默认格式 0。这种事最好在脚本里做参数校验,或者先在单条序列上跑一次看看输出。

再说一个关于查找性能的。如果你每次跑 BLAST 都要扫整个 nr 库(几十 GB),那是真慢。我建议建立几个子库:比如只包含细菌的、只包含人类的。用 seqkit grep 等工具按分类过滤原始 FASTA,再用 makeblastdb 建子库。这样小任务跑子库,大任务跑全库,灵活很多。

快速验证的套路:
echo -e ">test\nACGTACGTACGT" | blastn -db nt -outfmt "6 sseqid pident evalue" -max_target_seqs 5
这一小段能帮你秒级确认数据库和参数是否正常,而不是等几分钟发现配置错了。

最后,我想说:BLAST 的命令行看着简单,但每个参数背后都有 trade-off。在 GPU 集群上跑并行时,参数选择直接影响任务能不能平摊到多个核上。下一阶段我们会专门讲如何用这些参数来设计高效的并行调度,这里先把基础打牢。