第1章: Cromwell 简介
工作流引擎:为什么我们需要它?
先问个问题:你做过生信分析吧?
那肯定遇到过这种情况——一个RNA-seq流程,先跑FastQC,然后Trimmomatic,接着STAR比对,最后featureCounts定量。手动一个个跑,中间还得盯着log,出错了从头来。说实话,我个人刚开始做生信那会儿,经常半夜爬起来看任务跑完没有。效率低不说,还容易出错。
工作流引擎就是来解决这个痛点的。它能帮你把一堆工具串联起来,自动调度,失败重试,还能充分利用集群资源。说白了,你只需要写好分析流程,剩下的交给引擎处理。
Cromwell是Broad Institute开发的,一个开源的、面向生物信息学的工作流管理系统。不过实际项目里我不只用它跑生信流程,还跑过一些比较重的数据处理管线,效果都不错。
Cromwell的核心概念
| 概念 | 我个人的理解 |
|---|---|
| WDL (Workflow Description Language) | 写流程的"语言",类似写剧本。你定义好每一步做什么、用什么工具、需要什么参数 |
| Task | 最小执行单元。比如"用samtools排序"就是一个task,里面写清楚命令和资源需求 |
| Workflow | 多个task串起来形成的完整流程。可以是串行,也可以并行 |
| Call | 在工作流里调用一个task。一个task可以被调用多次,每次输入不同 |
| Backend | 实际执行任务的地方。可以是本地,也可以是集群(LSF、SGE、Slurm)或云(AWS、GCP) |
| Job | Cromwell提交到后端的一个具体执行实例。一个task可能对应多个job(比如并行跑样本) |
嗯,这里有个点要提一下。WDL是Cromwell的"母语",官方推荐用这个。虽然它也支持CWL,但我在项目里试过两者的兼容性,还是WDL更省心。
一个简单的WDL例子
workflow my_workflow {
call fastqc { input: read1 = sample1_R1.fastq }
call trim { input: read1 = fastqc.cleaned_read1 }
call align { input: read1 = trim.trimmed_read1 }
}
task fastqc {
input {
File read1
}
command {
fastqc ${read1}
}
runtime {
docker: "biocontainers/fastqc:v0.11.9"
cpu: 2
memory: "4 GB"
}
output {
File html_report = "${read1}_fastqc.html"
}
}
适用场景与选型分析
Cromwell不是万能的。我之前做过一个选型对比,简单整理了不同场景的优劣势:
| 场景 | Cromwell | 其他引擎 (如Snakemake/Nextflow) |
|---|---|---|
| 单机/小集群 | 可用,但调度开销相对大 | 轻量,上手更快 |
| 大规模并行 (1000+任务) | 调度能力强,成熟稳定 | 部分引擎可能会遇到瓶颈 |
| 云原生 (AWS/GCP) | 原生支持,集成度高 | 需要额外配置适配器 |
| 复杂DAG图 | 支持,但对WDL写法的要求高 | DAG支持普遍较好 |
| 企业/合规场景 | Broad背书,API成熟,易集成 | 社区驱动,企业级功能相对薄弱 |
| 灵活性/自定义 | 通过配置可高度自定义 | 部分引擎更"开箱即用" |
我个人的选型建议
如果你团队有运维人力,或者任务量真的到了几百上千个job并发,或者跑在云上,Cromwell是很稳的选择。如果只是个人跑几个样本,Snakemake可能更快上手。别贪大,够用就好。
Cromwell架构速览
一个基本的请求流程:
- 用户提交WDL 通过HTTP API或命令行
- 解析引擎 分析WDL,构建DAG
- 调度器 决定哪些任务可以并行执行
- 后端适配器 把任务转换成后端能理解的格式并提交
- 监控与状态跟踪 轮询后端,更新状态
为什么会把调度器单独拎出来?因为并行度控制、资源分配这些核心调优,本质上就是在跟调度器打交道。后面章节我会分享一些实战中踩过的坑。
避坑:不要以为WDL写对了就能直接跑
我曾经接手过一个项目,WDL语法完全正确,但一跑就卡住。查了半天,原来是Cromwell版本和WDL语法版本不匹配。注意:WDL有多个版本(draft-2、1.0、2.0),Cromwell不同版本支持程度不同。用新版特性时,先确认你的Cromwell版本对不对。
什么时候该用Cromwell?
- 任务量级大:几十个样本以上,或者单样本就有多步骤依赖
- 需要稳定重跑:你不想每次失败都从头来,Cromwell支持断点续跑和自动重试
- 异构环境:本地开发、集群跑、云上跑,Cromwell可以一套流程切换后端
- 需要API集成:Cromwell有REST API,可以嵌入到你的平台里
小提醒
Cromwell的配置确实有点复杂。第一次上手时,光看配置文件就花了半天。别急,我后面会从基础配置开始,一步步带你调优并行度和资源。说白了,花时间配置好,后面就省心多了。