第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架构速览

一个基本的请求流程:

  1. 用户提交WDL 通过HTTP API或命令行
  2. 解析引擎 分析WDL,构建DAG
  3. 调度器 决定哪些任务可以并行执行
  4. 后端适配器 把任务转换成后端能理解的格式并提交
  5. 监控与状态跟踪 轮询后端,更新状态

为什么会把调度器单独拎出来?因为并行度控制、资源分配这些核心调优,本质上就是在跟调度器打交道。后面章节我会分享一些实战中踩过的坑。

Cromwell 核心工作流程 用户提交 WDL 解析引擎 调度器 后端适配器 CLI / REST API 构建 DAG, 变量解析 依赖、并行度、资源分配 LSF / Slurm / AWS Batch ...

避坑:不要以为WDL写对了就能直接跑

我曾经接手过一个项目,WDL语法完全正确,但一跑就卡住。查了半天,原来是Cromwell版本和WDL语法版本不匹配。注意:WDL有多个版本(draft-2、1.0、2.0),Cromwell不同版本支持程度不同。用新版特性时,先确认你的Cromwell版本对不对。

什么时候该用Cromwell?

  • 任务量级大:几十个样本以上,或者单样本就有多步骤依赖
  • 需要稳定重跑:你不想每次失败都从头来,Cromwell支持断点续跑和自动重试
  • 异构环境:本地开发、集群跑、云上跑,Cromwell可以一套流程切换后端
  • 需要API集成:Cromwell有REST API,可以嵌入到你的平台里

小提醒

Cromwell的配置确实有点复杂。第一次上手时,光看配置文件就花了半天。别急,我后面会从基础配置开始,一步步带你调优并行度和资源。说白了,花时间配置好,后面就省心多了。