2. BLAST使用方法:命令行操作、参数详解、输入输出格式、本地BLAST安装与配置
BLAST 这东西,说白了就是序列比对领域的瑞士军刀。我刚开始搞生信的时候,总觉得它就是个黑盒子——扔一条序列进去,出来一堆结果,也不知道中间发生了什么。后来在 GPU 集群上调 BLAST 任务,才真正摸透了它的脾气。这一章,我就把本地 BLAST 的安装、参数、输入输出这些基础操作,掰开揉碎了讲一遍。
2.1 本地 BLAST 安装与配置
NCBI BLAST+ 是目前最主流的本地版。我个人习惯用 conda 装,干净省事。当然,你也可以去 NCBI ftp 下载预编译包。
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 实战避坑指南
这部分是我真正想分享的。纸上谈兵没用,咱们直接看几个常见问题。
- 数据库索引损坏:如果报
BLAST Database error,多半是makeblastdb时没加-parse_seqids,或者索引文字路径不对。用blastdbcmd -db nt -info检测一下。 - 线程调优:在 HPC 节点上,不要一股脑给满所有核。因为 BLAST 内部有 I/O 瓶颈,我测试过,NGS 数据和 8 核时性价比最高。
- 内存不足:如果用
-outfmt 5XML 输出一个大库,内存会暴涨。建议要么限制-max_target_seqs,要么换格式 6。 - 非标准字符:FASTA 序列里不能有
*-等非核酸/氨基酸字符,否则 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 集群上跑并行时,参数选择直接影响任务能不能平摊到多个核上。下一阶段我们会专门讲如何用这些参数来设计高效的并行调度,这里先把基础打牢。