1、Nextflow 简介与安装配置参数
1.1 为什么会有 Nextflow?
说实话,我刚入行做生物信息分析那会儿,日子过得挺苦的。
每次跑一个全基因组分析,要手动敲几十条命令。数据从 QC 到比对,再到变异检测,每一步都得盯着。中间某一步挂了,整个流程就得重启。更要命的是,换一台服务器或者换一批数据,脚本就得改一遍。你想想看,这有多折腾。
后来我接触到工作流管理系统,试过 Snakemake,也试过 CWL。但真正让我眼前一亮的是 Nextflow。为什么?因为它解决了一个核心痛点:一次编写,到处运行。
Nextflow 是 2016 年由 CRG(巴塞罗那基因组调控中心)开源的。它基于数据流编程模型,天然支持容错、断点续传、多平台执行。说白了,你只要写好流程,本地、集群、云端都能跑,代码不用改。
1.2 安装:选对路子省一半时间
安装 Nextflow 其实很简单。我建议直接用官方推荐的 curl 命令:
curl -s https://get.nextflow.io | bash
这条命令会下载一个 nextflow 可执行文件。把它放到 PATH 里,比如 /usr/local/bin/,就能用了。
不过,我踩过两次坑,这里给你提个醒:
- Java 环境必须提前装好。Nextflow 跑在 JVM 上,依赖 Java 11 或更高版本。你可以用
java -version检查一下。没有的话,装个 OpenJDK 就行。 - 注意给执行文件加执行权限。下载完后,运行
chmod +x nextflow。我曾经忘记这一步,折腾了半天才发现。
nextflow run hello。这个内置示例能验证安装是否正确,还能顺便测试网络能不能拉取依赖。一分钟搞定,省心。
除了源码安装,还有两种常见方式:
| 安装方式 | 命令 | 适用场景 |
|---|---|---|
| curl 安装 | curl -s https://get.nextflow.io | bash |
个人环境,无 Root 权限 |
| conda 安装 | conda install -c bioconda nextflow |
已用 Conda 管理的环境 |
| Docker 镜像 | docker pull nextflow/nextflow |
容器化部署 CI/CD 集成 |
1.3 核心概念:三个词搞懂 Nextflow
刚开始学 Nextflow 的人,容易被它那一堆术语吓住。其实核心概念就三个:进程(Process)、通道(Channel)、工作流(Workflow)。
- 进程:你写的一个计算步骤。比如比对、排序、去重。每个进程可以指定输入、输出和执行脚本。
- 通道:数据在进程之间流动的“管道”。通道可以理解为一个异步队列,数据从上游进程产出后,通过通道送给下游进程。
- 工作流:把这些进程和通道串起来的东西。它定义了执行逻辑,比如哪些进程并行跑,哪些串行跑。
举个例子,一个最简单的 RNA-seq 定量流程:
nextflow.enable.dsl=2
process FASTQC {
input:
path reads
output:
path "*.html"
script:
"""
fastqc ${reads}
"""
}
workflow {
FASTQC( Channel.fromPath( "*.fastq.gz" ) )
}
你看,Channel.fromPath 创建了一个通道,把 fastq 文件传给 FASTQC 进程。进程跑完后,结果自动输出。不用手动写循环,不用处理异常。
nextflow.enable.dsl=2。我见过有人还在用 DSL1 接手别人的老代码,那个维护起来真的是……嗯,别学他们。
1.4 参数系统初探:配置从哪里来?
参数是 Nextflow 流程里最灵活的部分。一个流程能不能在不同场景重用,往往看参数设计得好不好。
Nextflow 的参数来源有三个层级的覆盖关系:
- 默认值:在脚本里用
params.xxx定义的默认值。 - 配置文件:
nextflow.config里写的参数覆盖默认值。 - 命令行参数:运行
nextflow run时用--xxx传参,这个优先级最高。
优先级顺序是:命令行 > 配置文件 > 默认值。说白了,你命令行传了,就以命令行为准;没传但配置文件里写了,就以配置文件为准;都没写,才用脚本里的默认值。
看一下实际例子:
// main.nf
params.input_dir = "./data"
params.out_dir = "./results"
// nextflow.config
params {
input_dir = "/data/raw"
genome = "hg38"
}
// 运行时覆盖
nextflow run main.nf --input_dir /data/project --out_dir /data/output
最终生效的值是:input_dir = /data/project(命令行覆盖),out_dir = /data/output(命令行覆盖),genome = hg38(配置文件提供)。
nextflow.config 里,然后不小心上传到 Git 仓库。还好发现得早。现在我会用 params.secret = System.getenv('MY_SECRET') 从环境变量读取,配置文件里只占个位。
1.5 本章流程图:参数层级与执行逻辑
下面这张图把核心概念和参数覆盖关系串在一起,方便你从整体上理解:
1.6 小结与避坑
这一章我们聊了 Nextflow 的背景、安装、三个核心概念和参数系统的三层覆盖关系。对于初学者,我建议你先把安装跑通,然后用 nextflow run hello 感受一下流程是怎么执行的。接下来在自己项目里试着写一个只有两三个进程的小流程,比如 fastqc 加 multiqc。练几次就会了。
顺便提一句,nextflow.config 文件里还可以配置执行器(比如本地、SLURM、AWS Batch)、容器引擎(Docker、Singularity)、资源申请等。这些我们后面章节会逐一展开。