2. 安装与配置:把Nextflow跑起来
刚接触Nextflow时,我花了整整一个下午折腾环境变量。后来发现,其实理清楚三个环节就行:安装、设变量、调配置。咱们一步步来。
2.1 安装方式,选你顺手的
Nextflow本身是Java写的,所以依赖JDK。我个人习惯用Conda管理生物信息软件,但Docker和Singularity在集群上更常见。你想想看,本地开发用Conda,生产环境用容器,这是最舒服的搭配。
2.1.1 用Conda安装(推荐新手)
嗯,这里要注意:Conda环境隔离性好,不会污染系统Java版本。我在项目中遇到过好几次因为系统Java和Nextflow不兼容导致的诡异错误,用Conda环境就再也没出过这问题。
conda create -n nextflow_env openjdk=17 nextflow -c conda-forge -c bioconda
conda activate nextflow_env
nextflow -version
2.1.2 用Docker运行(适合容器化部署)
Docker方式其实最省心,镜像里啥都有。我曾经在给客户部署时,对方服务器Java版本是8,Nextflow新版要求11以上,直接拉起Docker镜像,三分钟解决问题。
docker pull nextflow/nextflow:latest
docker run --rm -v $PWD:/work -w /work nextflow/nextflow nextflow -version
2.1.3 用Singularity(集群专用)
说白了,Singularity是HPC集群的标配。安全权限控制比Docker严格,生物信息学集群几乎都支持。我建议你做分子对接Pipeline时,优先考虑Singularity,因为很多集群管理节点不让用Docker。
singularity pull docker://nextflow/nextflow:latest
singularity exec nextflow_latest.sif nextflow -version
2.2 环境变量,这些你得设
装完之后别急着跑,有四个环境变量我建议你提前配好。踩过坑的人都知道,缺一个就可能卡半天。
| 变量名 | 作用 | 我的建议 |
|---|---|---|
| NXF_HOME | Nextflow主目录,默认在~/.nextflow | 设到有大磁盘空间的路径,缓存文件会很大 |
| NXF_WORK | 工作目录,存放中间结果 | 集群上用scratch,本地用SSD |
| NXF_CLOUD | 云端配置(如AWS Batch) | 用不到就别设,默认就好 |
| NXF_PLUGINS | 插件目录 | 我习惯和项目放在一起,便于版本控制 |
我的配置示例:
export NXF_HOME=/data/nextflow
export NXF_WORK=/scratch/$USER/nextflow_work
export NXF_OPTS="-Xms1g -Xmx4g"
export NXF_SINGULARITY_CACHEDIR=/data/singularity_cache
加粗提醒:NXF_OPTS控制JVM内存。我刚开始没设这个,处理300个蛋白质配体对时直接OOM了...后来学乖了,至少给4GB。
2.3 基础配置文件,一次配好到处跑
Nextflow的配置文件叫nextflow.config。我个人习惯在项目根目录放一份,里面写两样东西:运行器选择、容器引擎配置。剩下的参数都通过参数化传递。
2.3.1 运行器配置(executor)
你想想看,Pipeline在哪跑?本地、SGE、Slurm还是AWS?这就是executor干的事。我一般这样配:
process {
executor = 'slurm'
queue = 'short'
time = '1h'
memory = '4GB'
cpus = 2
}
本地调试时换回executor = 'local'。别问我为什么强调这个——我曾经在集群上提交了一个本地模式的Pipeline,结果把登录节点跑挂了...
2.3.2 容器引擎配置
分子对接Pipeline里,Docking软件(如AutoDock Vina、gnina)通常用容器包装。我建议你这样配:
singularity {
enabled = true
autoMounts = true
cacheDir = "/data/singularity_cache"
}
docker {
enabled = false
}
为什么我优先用Singularity?因为集群上它原生支持,不需要root权限,而且镜像加载速度比Docker快。当然,你在本地Mac上开发时,用Docker更顺手。
2.3.3 缓存与断点续跑
这是Nextflow最让我感动的一点——自动缓存。你不需要手动管理中间文件。默认情况下,它会按task的输入、脚本、参数生成哈希,如果任务没改,直接复用。
cache {
lenient = false // 严格模式,任何变化都重跑
// 我一般设为false,避免意外跳过
}
但要注意:不要把cache和resume搞混。cache是全局行为,resume是运行时的选项。我刚开始时天天用-resume,但忘了配缓存路径,结果每次都全部重跑...
2.4 验证安装,跑个最小Pipeline
配好之后,别急着写复杂逻辑。先跑个Hello World,确认所有环节都通了。我在每一次新环境部署时都这样干:
nextflow run hello -profile test,docker
或者自己写个tiny pipeline:
#!/usr/bin/env nextflow
nextflow.enable.dsl=2
process sayHello {
script:
"""
echo "Nextflow is alive!"
hostname
date
"""
}
workflow {
sayHello()
}
保存为test.nf,然后执行:
nextflow run test.nf
# 应该看到 "Nextflow is alive!"
如果这一步报错,多半是Java版本不对。用java -version检查,OpenJDK 11以上就行。
java.lang.UnsupportedClassVersionError,八成是系统自带的JRE版本太老。别犹豫,用sdkman或conda装一个OpenJDK 17。
NXF_HOME和NXF_WORK加到.bashrc或.zshrc里,每次登录自动生效。我还会加一个别名:alias nf="nextflow run",省得天天敲全名。
2.5 本章知识体系
整个安装配置流程,说白了就是这张图:
这张图把整个安装流程串起来了。从选安装方式开始,到配环境变量,再到写基础配置,最后验证。我建议你按照这个顺序一步步来,别跳步。
好了,环境就绪。下一步,咱们该写Pipeline本身了。