분석을 다시 돌려도 같은 결과가 나올까요? Nextflow·nf-core와 Snakemake로 워크플로 관리하기
목차
📌 이 글에서 알 수 있는 것
- 셸 스크립트 대신 워크플로 관리자를 쓰는 이유
- nf-core/rnaseq 실행 옵션과
-vs--구분- work 디렉터리·캐시·
-resume의 동작- Snakefile 구조와 dry run·conda·Slurm 실행, 선택 기준
🧩 셸 스크립트로는 왜 부족할까
run_all.sh에 단계를 적으면, 37번째 시료에서 멈췄을 때 처음부터 다시 돌려야 하고 도구 버전은 기억에 의존합니다. 워크플로 관리자는 이를 네 가지로 풀어 줍니다1.
- 재개(resume): 끝난 단계는 건너뛰고 실패한 곳부터 돕니다.
- 병렬화: 의존 그래프를 보고 독립인 작업을 동시에 돌립니다.
- 실행 기록(provenance): 어떤 입력·명령·컨테이너로 무엇을 만들었는지 남깁니다.
- 이식성: 같은 코드를 노트북, HPC(Slurm 같은 스케줄러), 클라우드에서 돌립니다.
대표적인 것이 Nextflow(Groovy 기반 워크플로 언어·실행기)2와 Snakemake(Python 기반, 파일 이름으로 의존성 정의)3입니다. 컨테이너·conda는 6편을 보세요.
🚀 Nextflow 설치
옵션은 Nextflow 26.10.5 문서 기준이며, Bash 3.2 이상과 Java 17 이상이 필요합니다4.
java -version
curl -s https://get.nextflow.io | bash
chmod +x nextflow
mkdir -p $HOME/.local/bin && mv nextflow $HOME/.local/bin/
export PATH="$PATH:$HOME/.local/bin"
nextflow info
curl … | bash: 공식 설치 스크립트. 실행 권한을 주고PATH폴더로 옮긴 뒤nextflow info로 확인합니다.export는 현재 창에만 적용되니~/.bashrc(zsh는~/.zshrc)에도 넣으세요.- 자주 하는 실수: Java가 17 미만인 것(17~26 지원). 없으면 SDKMAN으로
sdk install java.
▶️ nf-core/rnaseq 실행하기
nf-core는 커뮤니티가 공동 관리하는 Nextflow 파이프라인 모음입니다5. 분석 흐름은 12편에서 다룰 nf-core/rnaseq 3.27.0으로 예를 듭니다6.
nextflow run nf-core/rnaseq -r 3.27.0 -profile test,docker --outdir results_test
-r 3.27.0: 파이프라인 버전(Git 태그). 문서는 브랜치보다 태그·커밋 ID를 권합니다7.-profile test,docker:test는 작은 테스트 데이터,docker는 모든 도구를 Docker 컨테이너로 돌립니다(Docker 실행 필요). 뒤쪽이 앞쪽을 덮어씁니다.--outdir: 최종 결과 폴더.- 자주 하는 실수:
-profile을 빼 PATH의 도구로 돌아, 컴퓨터마다 결과가 달라집니다.
실제 데이터는 아래처럼 samplesheet.csv를 만듭니다(단일 말단은 fastq_2 칸을 비움).
sample,fastq_1,fastq_2,strandedness
CTRL_1,/data/s1_R1.fastq.gz,/data/s1_R2.fastq.gz,auto
nextflow run nf-core/rnaseq -r 3.27.0 -profile docker \
--input samplesheet.csv --outdir results \
--fasta ref.fa --gtf genes.gtf -resume
--input: samplesheet.strandedness가auto면 리드 100만 개로 가닥 특이성을 추정합니다6.--fasta·--gtf: 참조 유전체와 주석. 판본을 적어 두세요.-resume: 이전 캐시를 재사용합니다.- 자원: 정렬 등 큰 단계는 CPU 12개·메모리 72GB를 요청해, 작은 컴퓨터에선
… exceeds available CPUs(또는memory)로 멈춥니다. 아래-c예로 상한을 정하세요(STAR는 사람 유전체에 약 38GB). 메모리가 적다고--aligner hisat2로 바꾸는 건 답이 아닙니다(색인 생성 요청이 더 크고, 정량도 빠짐)6. - 자주 하는 실수: Docker가 없는 HPC에서
docker프로필을 쓰는 것입니다.singularity·apptainer를 쓰세요.
➖ 한 줄 대시와 두 줄 대시는 다릅니다
공식 문서는 한 줄 대시(-)는 Nextflow 자체 옵션, 두 줄 대시(–)는 파이프라인으로 넘기는 파라미터로 나눕니다7.
| 구분 | 예 |
|---|---|
Nextflow 옵션 (-) | -r, -profile, -resume, -params-file, -c, -w |
파이프라인 파라미터 (--) | --input, --outdir, --fasta, --gtf |
--resume은 직접 짠 파이프라인에선 파라미터가 될 뿐 재개되지 않고, nf-core에선 파라미터 검사 오류로 멈춥니다. -outdir은 “Unknown option” 오류가 납니다.
🗂️ work 디렉터리, 캐시, -resume
Nextflow는 작업(task)마다 이름·입력·스크립트·컨테이너 등으로 해시를 계산해 work/ 아래 고유 폴더에서 실행합니다. 입력 파일은 경로·수정 시각·크기로 판단합니다. -resume은 같은 해시가 캐시(.nextflow/cache)에 있고 work/에 출력이 남은 작업만 건너뜁니다8.
- 둘 다 지켜야 합니다.
.nextflow/와work/가 모두 남고 같은 폴더에서 실행해야 재개됩니다. - 고치면 다시 돕니다. 스크립트·컨테이너·입력을 바꾼 단계부터 그 뒤까지 다시 돕니다. NFS처럼 수정 시각이 어긋나는 곳에선
-c설정에process.cache = 'lenient'(경로·크기만 비교)를 씁니다8.
nextflow log
nextflow clean -n -before <run_name>
log: 지난 실행 이름·세션 ID·상태. 특정 실행은-resume <세션 ID>로 잇습니다(이름을 쓰면 마지막 실행).clean -n: 지울 목록만 보는 dry run.-f로 바꾸면 실제 삭제이고,-before·-but으로 범위를 정합니다9.- 자주 하는 실수:
rm -rf work후-resume을 기대하는 것입니다.
⚙️ 파라미터 파일, 설정 파일, 기관 프로필
nextflow run nf-core/rnaseq -r 3.27.0 -profile singularity \
-params-file params.yaml -c custom.config -resume
-params-file: 파라미터를 YAML·JSON으로 묶습니다(input: samplesheet.csv처럼 한 줄씩). 같은 값이 겹치면 명령줄--가 이 파일보다 우선합니다7.-c custom.config: 자원·스케줄러 설정을 덧붙입니다. 예)process { resourceLimits = [cpus: 8, memory: 40.GB, time: 24.h] }처럼 사양 이하로 적으면 이를 넘는 요청만 상한으로 줄어듭니다10.- 자주 하는 실수:
-c파일에 파라미터를 넣는 것입니다. nf-core 문서는 오류가 난다며 금지합니다6.
기관 HPC 설정은 nf-core/configs에 프로필로 있어 -profile <기관명>으로 쓰고, 오프라인 클러스터에는 nf-core pipelines download(nf-core/tools 4.x)로 받아 옮깁니다11.
🐍 Snakemake: 규칙과 파일 이름으로 잇기
Snakemake는 “이 출력을 만들려면 이 입력이 필요하다"는 규칙(rule)에서 목표 파일부터 거꾸로 작업을 계산합니다3. {sample} 같은 와일드카드가 파일 이름의 빈칸을 채웁니다.
SAMPLES = ["A", "B"]
rule all:
input: expand("results/{sample}.sorted.bam", sample=SAMPLES)
rule align:
input: r1="data/{sample}_R1.fastq.gz", r2="data/{sample}_R2.fastq.gz"
output: "results/{sample}.bam"
threads: 4
conda: "envs/align.yaml"
shell: "bwa mem -t {threads} ref.fa {input.r1} {input.r2} | samtools view -b -o {output} -"
rule sort:
input: "results/{sample}.bam"
output: "results/{sample}.sorted.bam"
conda: "envs/align.yaml"
shell: "samtools sort -o {output} {input}"
rule all: 최종 목표.expand()가 시료 이름을 채웁니다.input·output·shell: 입력, 출력, 명령.Snakefile로 저장하고 같은 폴더에data/A_R1.fastq.gz처럼 이름을 맞춘 FASTQ,bwa index ref.fa로 만든 색인,envs/align.yaml(channels: [conda-forge, bioconda],dependencies: [bwa, samtools]두 줄)을 둡니다.- 자주 하는 실수: 파일 이름이 다른 것입니다.
MissingInputException에sample=A.sorted가 보여도data/이름부터 보세요.
옵션은 Snakemake 9.27.1 기준입니다12.
snakemake -n --sdm conda
snakemake --cores 4 --sdm conda
snakemake --executor slurm --jobs 50 --profile profiles/slurm
snakemake --dag | dot -Tsvg > dag.svg
-n(--dry-run): 실행 없이 작업 목록(위 예는 align 2·sort 2·all 1)만 봅니다. 실행할 때와 같은 옵션을 붙이세요.--cores 4: 로컬 최대 코어 수.--sdm conda(--software-deployment-method): 규칙의conda:환경으로 실행합니다. 컨테이너는--sdm apptainer입니다13.--executor slurm: 따로 설치한snakemake-executor-plugin-slurm으로 제출합니다.--jobs는 동시 제출 수,--profile은 옵션·자원을 적은profile.yaml이나 그 폴더입니다14.--dag | dot: 작업 그래프를 Graphviz로 그립니다.- 자주 하는 실수:
--sdm conda를 빼conda:가 무시되고 PATH의 다른 버전 도구가 쓰이는 것입니다.
Snakemake는 -resume 없이도 있는 출력을 건너뛰고(강제 종료 뒤엔 --rerun-incomplete), 재실행 기준에 코드·파라미터·입력·환경이 들어 있어 규칙을 고치면 그 규칙부터 다시 돕니다12.
⚖️ 무엇을 고를까
검증된 표준 분석을 그대로 쓸 때는 Nextflow + nf-core, 맞춤 분석이거나 Python에 익숙하면 Snakemake가 잘 맞습니다.
✅ 실행 결과는 이렇게 검증합니다
- test 프로필 먼저: 같은 버전·컨테이너로 끝까지 도는지 봅니다.
- MultiQC(QC 통합 보고서):
results/multiqc/<정렬기>/(기본star_salmon)에서 시료별 QC와 소프트웨어 버전 표를 봅니다6. pipeline_info/: 도구 버전 파일(3.27.0은nf_core_rnaseq_software_mqc_versions.yml)과params_<날짜>.json(실제 파라미터)을 보관합니다.- Methods에 적기: 예) “nf-core/rnaseq 3.27.0(Nextflow 26.10.5, Singularity 프로필)으로 처리했고 참조는 GRCh38, Ensembl ○○판 주석을 썼다.” 파이프라인 DOI 인용도 요청합니다6.
⚠️ 한계와 주의 — 자주 하는 실수
- 버전 미고정:
-r이 없으면 처음 받아 둔 코드가 쓰여, 다른 컴퓨터나nextflow pull뒤엔 같은 명령이 다른 버전으로 돕니다6. - work 용량: 중간 BAM까지 남아 결과보다 커집니다.
-w로 scratch에 두고15nextflow clean으로 정리하세요.cleanup = true는 성공 시 자동 삭제하지만 재개가 불가능해집니다16. - HPC 장시간 실행: Nextflow 본체는 끝까지 살아 있어야 하니 6편의 tmux·nohup이나
nextflow -bg run …으로 띄우고(로그인 노드 실행이 금지되면 본체도 작업으로 제출), 작업은-profile <기관명>으로 스케줄러에 보냅니다. 이미지 캐시는NXF_SINGULARITY_CACHEDIR(apptainer는NXF_APPTAINER_CACHEDIR)로 공용 폴더에 둡니다. - 한계: 워크플로 관리자는 실행을 재현할 뿐, 파라미터가 라이브러리에 맞는지는 보장하지 않습니다.
🏛️ 지금 어디까지 왔나
- 판본(2026-11-06): Nextflow 26.10.5, nf-core/rnaseq 3.27.0(Nextflow 25.10.4 이상 필요), Snakemake 9.27.1.
- 커뮤니티: nf-core 파이프라인 124개(2025년 2월), GitHub 기여자 2,600명 이상17.
🧪 연구자 노트
- 직접 짜기 전에 nf-core처럼 검증된 파이프라인을
-profile test로 먼저 돌려 보세요.- 실행이 끝나면 버전 파일과 파라미터 파일을 결과와 함께 보관하세요. 몇 달 뒤 Methods를 쓸 때 가장 먼저 찾게 됩니다.
🙋 그래서 나에게는? — 실습 전 체크리스트
-
nextflow info·snakemake --version으로 실행기 버전을 기록했다 - nf-core 실행에
-r <버전>을 붙였다 - 같은 버전으로
-profile test,<컨테이너>를 먼저 통과시켰다 -
work/위치와 정리 계획이 있다 -
pipeline_info/의 버전·파라미터 파일을 보관하고 Methods에 버전을 적었다
⚠️ 이 글은 의학적 조언이 아니며, 특정 제품을 권하지 않습니다. 실제 옵션은 사용하는 도구 버전의 매뉴얼과 기관 SOP, 자체 검증 결과를 우선하세요.
❓ 자주 묻는 질문
Q. -resume을 붙였는데 처음부터 다시 돕니다. 왜 그럴까요?
A. 다른 폴더에서 실행했는지, work/·.nextflow/를 지웠는지, --resume으로 썼는지 보세요. 입력을 다시 복사해 수정 시각이 바뀌어도 캐시가 깨집니다.
Q. nf-core 파이프라인 옵션을 바꾸려면 코드를 고쳐야 하나요?
A. 대부분 -- 파라미터나 -params-file로 바꿉니다. 도구 인자나 자원은 -c 설정으로 덧붙이고 코드는 그대로 둬야 버전 관리가 쉽습니다.
Q. 이미 셸 스크립트가 잘 돌아가는데 꼭 옮겨야 하나요? A. 한 번만 돌릴 작은 분석이면 꼭 그렇지는 않습니다. 시료가 늘거나, 남이 다시 돌리거나, 논문에 실릴 분석이라면 얻는 것이 더 큽니다.
📚 오믹스 기술 시리즈
- 1편 WGS 플랫폼 비교
- 2편 WGS 커버리지·깊이 설계
- 3편 WGS 데이터 처리와 QC
- 4편 WGS vs WES vs 패널
- 5편 리눅스 명령줄 기본기
- 6편 분석 환경 만들기
- 7편 FASTQ·BAM 실전
- 8편 VCF·BED 실전
- 9편 워크플로 관리 (이 글)
- 10편 R과 Python
- 11편 RNA-seq 실험 설계
- 12편 RNA-seq 데이터 분석
- 13편 small RNA-seq 실험 설계
- 14편 small RNA-seq 데이터 분석
참고
Wratten L 외. Reproducible, scalable, and shareable analysis pipelines with bioinformatics workflow managers. Nat Methods 2021;18:1161-8. doi:10.1038/s41592-021-01254-9 ↩︎
Di Tommaso P 외. Nextflow enables reproducible computational workflows. Nat Biotechnol 2017;35:316-9. doi:10.1038/nbt.3820 ↩︎
Mölder F 외. Sustainable data analysis with Snakemake. F1000Res 2021;10:33. doi:10.12688/f1000research.29032.3 ↩︎ ↩︎
Nextflow 26.10.5 문서: Installation (2026-11-06 접속) — nextflow.io/docs ↩︎
Ewels PA 외. The nf-core framework for community-curated bioinformatics pipelines. Nat Biotechnol 2020;38:276-8. doi:10.1038/s41587-020-0439-x ↩︎
nf-core. nf-core/rnaseq 3.27.0 README·Usage·Output 문서, nextflow.config와 파이프라인 소스, 인용 DOI 10.5281/zenodo.1400710(2026-09-23 공개, 2026-11-06 접속) — nf-co.re/rnaseq ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Nextflow 26.10.5 문서: Command line interface(옵션과 파라미터, Revision selection, Parameter precedence; 2026-11-06 접속) — nextflow.io/docs ↩︎ ↩︎ ↩︎
Nextflow 26.10.5 문서: Caching and resuming (2026-11-06 접속) — nextflow.io/docs ↩︎ ↩︎
Nextflow 26.10.5 문서: CLI reference
nextflow clean(2026-11-06 접속) — nextflow.io/docs ↩︎Nextflow 26.10.5 문서: Process directives
resourceLimits(24.04 도입, 상한을 넘는 요청만 상한으로 축소; 2026-11-06 접속) — nextflow.io/docs ↩︎nf-core/configs README·nf-core/tools 4.2.1 CLI (2026-11-06 접속) — github.com/nf-core/configs ↩︎
Snakemake 9.27.1 명령줄 도움말(src/snakemake/cli.py: –dry-run, –cores, –jobs, –profile, –executor, –rerun-triggers, –dag, –rulegraph; 2026-11-06 접속) — snakemake.readthedocs.io ↩︎ ↩︎
Snakemake 9.27.1 문서: Distribution and Reproducibility(–software-deployment-method, –sdm; 2026-11-06 접속) — snakemake.readthedocs.io ↩︎
snakemake-executor-plugin-slurm 2.8.0 문서 (2026-11-06 접속) — snakemake.github.io/snakemake-plugin-catalog ↩︎
Nextflow 26.10.5 문서: CLI reference
nextflow run(-profile, -resume, -r, -w; 2026-11-06 접속) — nextflow.io/docs ↩︎Nextflow 26.10.5 문서: Configuration options, unscoped
cleanup(2026-11-06 접속) — nextflow.io/docs ↩︎Langer BE 외. Empowering bioinformatics communities with Nextflow and nf-core. Genome Biol 2025;26:228. doi:10.1186/s13059-025-03673-9 ↩︎