1. Nextflow简介

大家好,欢迎来到这门课。

说起Nextflow,我刚开始接触时也觉得它就是个“高级的批次系统”。直到真正用它在几百个节点上跑通了一个全基因组分析流程,才彻底服气。

今天这一章,我们先站在高处看一眼Nextflow到底是什么、怎么来的、能干什么、以及怎么把它装到你的机器上。

1.1 为什么会有Nextflow?

2013年之前,生物信息学领域有个普遍的痛点:每个人写流程都用不同的脚本语言,Python、Perl、Bash混着来。换个集群环境就得重写调度逻辑,换个工具版本就得改管道——说白了,可移植性极差。

CRG(Centre for Genomic Regulation)的 Paolo Di Tommaso 团队决定解决这个问题。他们用一种哲学来设计Nextflow:

  • 流程逻辑 和 执行环境 彻底解耦
  • 脚本写一次,本地、SLURM、AWS、Kubernetes 都能跑
  • 天然支持数据流、容错、容器化

2013年发布第一个版本,2018年进入爆发期,到2024年已经是生物信息学领域事实上的标准工作流引擎之一。我个人觉得,它的成功核心就两点:抽象得好,生态接地气。

一句话总结:Nextflow 让你用 Groovy/DSL 写流程,然后丢给任何计算后端去跑;你不需要关心它在本地跑还是SLURM集群上跑,代码基本不变。

3个核心概念,一次讲清

很多人刚开始会被"Channel"、"Process"、"Workflow"这些词搞懵。我建议你先记住这三个东西的关系:

  1. Process:最小的执行单元。一个 Process 做一件事,比如比对、排序、变异检测。
  2. Channel:数据传输管道。Channel 里流的是文件、值、元数据,Process 从 Channel 读入,往 Channel 输出。
  3. Workflow:流程编排。定义 Process 之间怎么连接、哪个先跑、哪个并行。

举个例子:

// 一个简化的工作流骨架
process BWA_MEM {
    input:
    path fastq

    output:
    path "aligned.sam"

    script:
    """
    bwa mem -t 4 genome.fa $fastq > aligned.sam
    """
}

workflow {
    // 从外部接收FASTQ文件
    reads = Channel.fromPath("data/*.fastq")
    // 把每个文件送给BWA_MEM去跑
    BWA_MEM(reads)
}

看到了吗?代码里没有SLURM配置、没有队列名、没有节点数——这些交给配置文件去管。这就是Nextflow的优雅之处。

给我个人小提示:刚上手别急着学Groovy语法细节。你只需要知道:每个 Process 是一段脚本(Bash、Python、Perl都行),Workflow 是连接图。剩下的,遇到什么查什么。

1.3 它最擅长干什么?

为什么Nextflow在生物信息学里这么火?因为它天生解决这些问题:

场景 痛点 Nextflow 怎么帮
多步骤生物信息学管道 步骤多、依赖乱、重跑费时 自动缓存中间结果,只重跑失败步骤
跨计算环境迁移 本地和集群配置不统一 配置里改一行 executor 就行
并行处理大批量样本 手动分任务、监控麻烦 自动调度、reTry、资源管理
使用容器/Singularity 环境不一致导致报错 原生支持 Docker/Singularity/Conda

当然,我不建议用它做实时流处理、也不建议在纯CPU密集型HPC里硬套它的容器机制。但你想想看,很多实验室的流程真的不复杂,只是样本量大、环境乱——Nextflow恰好对症。

1.4 安装与验证

安装这事,我之前踩过一个坑:忘记装Java。Nextflow本质是JVM上的程序,所以必须要有 JDK 11+。

安装方式一:推荐(自动安装脚本)

curl -fsSL https://get.nextflow.io | bash
chmod +x nextflow
# 把它放到PATH里
sudo mv nextflow /usr/local/bin/

安装方式二:使用包管理器

# conda用户
conda install -c bioconda nextflow

# macOS (Homebrew)
brew install nextflow

# 手动下载
wget https://github.com/nextflow-io/nextflow/releases/latest/download/nextflow
chmod +x nextflow
./nextflow -version

我曾经遇到的坑:在SLURM集群登录节点上直接装Nextflow,结果~/.nextflow自动创建在/home目录。最后作业一多,home满了。建议把NXF_HOME设到有空间的分区上,比如:

export NXF_HOME=/data/software/nextflow

验证是否安装成功:

nextflow run hello
# 你应该看到类似这样的输出:
# N E X T F L O W  -  version 24.04.2
# Launching `hello.nf` [friendly_curie] DSL2 - revision: ...
# Hello world!
# Hello world!

这段代码跑的是Nextflow内置的一个示例流程。它会打印两行“Hello world!”,底下还会显示:资源用量、缓存信息、状态(COMPLETED)。如果你看到了这个,嗯,你已经准备好了。

快速检查Java版本:

java -version
# 要求:openjdk version "11.0.x" 或更高

验证一步到位:我在新服务器上习惯跑一条“自动测试”命令:

nextflow run hello -with-docker -bucket-dir /tmp/test_bucket

这能同时验证:Nextflow是否能正常运行、Docker是否可用、以及中间文件缓存是否工作。

Nextflow 工作流基本执行流程 DSL 脚本 Nextflow 事件驱动引擎 本地 集群 Local Executor SLURM / SGE / AWS 结果 / 报告 / 日志 编译器解析DSL → 编排成DAG → 交给对应执行器 → 自动缓存与重试

1.5 关于版本和生态

截止到2025年初,Nextflow稳定版是24.x。从22.x到24.x,核心变化不大,但DSL2已成为默认语法。我建议所有人都用DSL2,别回头去写老的DSL1。

另外,nf-core 社区提供了上百个现成的生产级流程。你如果不想从零写,直接拿 nf-core 的模板改,那是真香。我好几条管道都是基于 nf-core/sarek 魔改的。

一句话总结这章的内容:

  1. Nextflow 是一个工作流引擎,核心优势是“一次编写,到处运行”。
  2. 核心三要素:Process、Channel、Workflow。
  3. 它特别适合生物信息学这类步骤多、样本大的场景。
  4. 安装非常简单,但别忘了设 NXF_HOME。
  5. 验证用 nextflow run hello,看到绿色 COMPLETED 就对了。