왜 로컬 BLAST가 필요한가
NCBI BLAST 웹은 편리하지만 세 가지 한계가 있습니다.
- 트래픽 제약: 하루에 수백 개 쿼리를 자동으로 돌리면 NCBI 서버가 제한을 걸 수 있습니다. 실무 파이프라인에는 부담됩니다.
- 자기 데이터: 자기가 조립한 미생물 게놈, 자기 실험실의 발현 서열, 미공개 데이터에 대해 BLAST를 하려면 로컬이 유일한 답입니다.
- 재현성: 웹 BLAST의 검색 결과는 데이터베이스가 갱신되면 달라집니다. 논문의 재현성을 위해서는 특정 시점의 데이터베이스로 로컬에서 실행해야 합니다.
이 편에서 우리는 BLAST+ (NCBI가 배포하는 로컬 BLAST 도구 모음)을 설치하고, 자기 서열을 데이터베이스로 만들고, 쿼리를 실행하는 전체 절차를 밟습니다. 이 편이 끝나면 blastn · blastp · tblastn 명령어를 자연스럽게 다룰 수 있게 됩니다.
1단계 — BLAST+ 설치
플랫폼별 설치 방법입니다.
Ubuntu · Debian
sudo apt-get updatesudo apt-get install -y ncbi-blast+blastn -versionmacOS (Homebrew)
brew install blastblastn -versionConda 환경(권장)
conda create -n blast-env -c bioconda blastconda activate blast-envblastn -versionDocker
docker pull ncbi/blastdocker run --rm -v $(pwd):/blast/blastdb ncbi/blast blastn -version정상적으로 설치되면 다음이 뜹니다.
blastn: 2.14.0+
Package: blast 2.14.0, build ...2단계 — 자기 데이터베이스 만들기
makeblastdb가 FASTA 파일을 BLAST가 검색할 수 있는 인덱스로 변환합니다.
DNA 데이터베이스
makeblastdb \ -in my_contigs.fasta \ -dbtype nucl \ -out my_db_nucl \ -title "My Custom Nucleotide Database"
ls -la my_db_nucl.*이 명령이 다음 파일들을 만듭니다.
my_db_nucl.nhr # 헤더
my_db_nucl.nin # 인덱스
my_db_nucl.nsq # 서열단백질 데이터베이스
makeblastdb \ -in my_proteins.fasta \ -dbtype prot \ -out my_db_prot \ -title "My Custom Protein Database"파일 확장자가 .phr, .pin, .psq로 바뀝니다.
인덱싱 자체는 서열이 100MB 정도라면 몇 초, 인간 게놈 규모(3GB)라면 몇 분 걸립니다. 한 번 만들면 그 뒤로는 계속 재사용합니다.
3단계 — BLAST 검색 실행
# 쿼리 서열이 query.fasta에 있다고 가정blastn \ -query query.fasta \ -db my_db_nucl \ -out results.txt \ -outfmt 7 \ -evalue 1e-5 \ -num_threads 4주요 옵션:
-outfmt 7: 결과를 탭 구분 표(주석 포함)로 출력.-outfmt 6은 주석 없는 순수 표.-outfmt 5는 XML.-evalue 1e-5: E-value 임계. 유의한 매치만 뱉음.-num_threads 4: 4 CPU 코어로 병렬화.-max_target_seqs 100: 상위 100개 매치만 보고.
단백질 검색은 blastp, 번역 검색은 tblastn · blastx를 씁니다.
4단계 — 결과 파싱
-outfmt 6 표 형식의 각 열은 다음과 같습니다.
qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore예시 결과 한 줄:
Contig_1 gene_BRCA1 99.5 1420 7 0 1 1420 100 1519 0.0 2620파이썬으로 파싱하는 예시입니다.
import pandas as pd
cols = [ "qseqid", "sseqid", "pident", "length", "mismatch", "gapopen", "qstart", "qend", "sstart", "send", "evalue", "bitscore"]df = pd.read_csv("results.txt", sep="\t", names=cols, comment="#")
# 유의한 매치만sig = df[df["evalue"] < 1e-10].sort_values("evalue")print(sig.head())이 표를 pandas로 다루기 시작하면 실무의 문이 열립니다. 그룹별 집계, 유전자 어노테이션 병합, 시각화 다 자연스럽게 이어집니다.
5단계 — 자동화 파이프라인
여러 쿼리를 배치로 돌리는 스크립트 예시입니다.
#!/bin/bash# batch_blast.shQUERIES_DIR=queries/RESULTS_DIR=results/mkdir -p $RESULTS_DIR
for query_file in $QUERIES_DIR/*.fasta; do name=$(basename "$query_file" .fasta) blastn \ -query "$query_file" \ -db my_db_nucl \ -out "$RESULTS_DIR/${name}.tsv" \ -outfmt 6 \ -evalue 1e-5 \ -num_threads 4 echo "완료: $name"done이걸 나중에 Snakemake(F27) · Nextflow(F28) 같은 워크플로우 관리자로 감싸면 재현성 있는 파이프라인이 됩니다.
실습 — 자기 미생물 게놈 하나로
가장 재밌는 실습은 자기 관심 미생물 게놈으로 시작하는 것입니다.
- NCBI Genome에서 관심 미생물 게놈(예: E. coli K-12 MG1655)을 다운로드.
makeblastdb로 인덱싱.- 자기가 실험적으로 검증했거나 관심 있는 유전자 서열을 쿼리로 사용.
- E-value 임계를 조정하며 결과 관찰.
Colab에서도 가능합니다. !apt install ncbi-blast+ 한 줄이면 셋업입니다.
NCBI 공식 데이터베이스 다운로드
자기 데이터가 아닌 NCBI 공식 데이터베이스(nr, refseq_rna, swissprot 등)를 로컬로 가져올 수도 있습니다.
# nr 다운로드 (매우 큰 파일 — 200GB+ 압축, 500GB+ 압축 해제)update_blastdb.pl --decompress nr
# swissprot (작음 — 200MB)update_blastdb.pl --decompress swissprotupdate_blastdb.pl은 BLAST+ 설치에 포함된 헬퍼입니다. 병렬 다운로드와 무결성 검증까지 자동으로 해줍니다.
정기 갱신을 위해 cron으로 등재하면 항상 최신 데이터베이스를 로컬에 유지할 수 있습니다.
자주 만나는 실무 함정
- 디스크 공간: nr 전체는 500GB+ 필요합니다. 사전에 확인.
- 메모리 사용: 큰 데이터베이스로 검색 시 메모리가 부족할 수 있습니다.
-mt_mode 1(query 병렬) vs 기본(database 병렬) 옵션의 트레이드오프를 파악하세요. - 버전 호환성: 다른 버전의 BLAST+로 만든 데이터베이스가 최신 버전에서 안 열릴 수 있습니다. 데이터베이스와 실행 도구의 버전을 문서화합시다.
- 쿼리 서열 오염: FASTA 헤더에 특수 문자나 공백이 있으면 파싱이 실패합니다.
seqkit clean같은 도구로 정리하고 시작합시다. - 저복잡도 필터: 기본으로 dust · seg 필터가 켜져 있습니다. 반복 서열이 많은 쿼리(전이인자 등)를 검색할 때는
-dust no로 끕니다.
CS 매핑
- 인덱스 사전 계산 vs 실시간 검색:
makeblastdb가 하는 일이 정확히 데이터베이스 인덱싱의 CS 원리입니다. 사전 계산의 대가로 검색이 빨라집니다. - 로컬 파일시스템 vs 원격 API: 로컬 BLAST는 파일시스템 I/O에 최적화됩니다. NCBI 웹은 네트워크 라운드트립에 최적화. 서로 다른 트레이드오프.
- 배치 vs 대화형: 로컬 BLAST가 자연스럽게 배치 처리에 맞습니다. 워크플로우 관리자로 감싸기 쉽고, 재현성 있는 파이프라인의 뿌리입니다.
다음 편으로 이어지는 갈래
- 다음 편 (M13): 접미사 트리 · 배열 — BLAST 인덱스보다 정교한 자료구조.
- 두 편 뒤 (M14): BWT — BWA · Bowtie2가 사용하는 압축 인덱스.
- 세 편 뒤 (M15): FM-index — BWT + 랭크/셀렉트로 완성되는 초고속 매핑 자료구조.
- 다섯 편 뒤 (M17): DIAMOND — BLAST의 100배 빠른 대안.
- 스물다섯 편 뒤 (F27): Snakemake — 배치 BLAST를 재현성 있는 파이프라인으로.
더 깊게 파고 싶다면
본문은 BPD가 자체 재구성한 서술입니다. 심화는 아래로.
- NCBI Handbook — Chapter 16: BLAST+ User Manual. 실무 옵션의 정통 참고.
- NCBI Training — Standalone BLAST Setup (자막 완비). 설치 · 검색 · 파싱을 30분 안에.
- EMBL-EBI Training — Sequence Similarity Searches. BLAST의 실무 응용.
- 참고 도구: Biopython (
Bio.Blast.NCBIWWW.qblast+Bio.Blast.NCBIXML) — 웹 BLAST를 파이썬에서 조작. 프로토타입에 좋음. - 참고 컨테이너:
ncbi/blastDocker 이미지. 컨테이너 안에서 재현성 있게 실행.
로컬 BLAST를 세팅하고 자기 관심 서열로 몇 번 실행해보면, NCBI 웹의 답답함이 완전히 사라집니다. 이 편의 정착이 M12 이후 편에서 등장할 매핑 · 어셈블리 · 변이 검출 파이프라인의 기반이 됩니다.