Cromwell 简介:这东西到底能干什么?

我第一次接触 Cromwell,是几年前在一个基因组分析项目里。当时团队手上有几十个样本要跑 GATK Best Practices,本地集群排队排到天荒地老。有人提了一句:要不试试 Cromwell?

结果一试就回不去了。

Cromwell 是个开源的工作流管理系统,说白了,它负责「把你写好的工作流跑起来」。你提供 WDL 或 CWL 描述文件,它帮你调度任务、管理依赖、处理失败重试、收集日志。你不需要自己写复杂的 shell 脚本来编排任务,也不用操心哪个任务先跑、哪个任务后跑。

它的核心逻辑很简单:

  • 工作流定义:你用 WDL(Workflow Description Language)或 CWL 写清楚每个任务的输入、输出、命令。
  • 执行后端:Cromwell 把任务扔给不同的计算环境——可以是本地机器、SLURM 集群、Google Cloud Batch、AWS Batch,或者阿里云的 BatchCompute。
  • 状态管理:它会记录每个任务的运行状态,失败后自动重试,甚至支持断点续跑。

举个例子,一个简单的 WDL 工作流大概长这样:

workflow myWorkflow {
    call myTask
}

task myTask {
    input {
        File inFile
    }
    command {
        echo "Hello, Cromwell!" > output.txt
    }
    output {
        File outFile = "output.txt"
    }
}

看着挺清爽吧?但真正用起来,坑可不少。我后面会慢慢讲。

为什么需要混合云执行?

你想想看,如果你的工作流永远跑在本地集群,那闭着眼睛用 Cromwell 就行。但现实是——

  • 本地资源有限:高峰期任务排队,一个样本等三天。
  • 云端弹性好:突发流量可以一键扩容,用完释放,按量付费。
  • 数据合规要求:有些数据必须留在本地,不能上云。
  • 成本控制:长周期任务放本地,短期爆发任务放云端,更划算。

混合云执行就是让 Cromwell 同时管理本地和云端的计算资源。任务调度时,你可以指定某些任务在本地跑,某些任务在云端跑,甚至动态决定——比如本地集群忙的时候自动 spill over 到云端。

一个典型的混合云场景:

  • 数据预处理(质量控制、比对)在本地高性能集群完成,因为数据量大,上传云端太慢。
  • 变异检测、群体分析等计算密集型任务,动态扩展到云端 GPU 实例。
  • 最终结果下载回本地归档。

我曾经帮一家基因检测公司搭过这套架构。本地有 500 核 SLURM 集群,云端接阿里云 BatchCompute。平时日常任务用本地跑,遇到季度大促(批量样本涌入),自动触发云端扩容。系统跑了一年多,算下来节省了 40% 的云资源费用。

适用场景:哪些项目该用混合云?

场景推荐度说明
周期性大批量数据分析(如基因组季度分析)⭐⭐⭐⭐⭐突发流量靠云,日常靠本地
数据敏感且不能出域⭐⭐⭐⭐本地跑核心分析,云端跑脱敏后处理
需要 GPU 但本地 GPU 稀缺⭐⭐⭐⭐云端按需租 GPU,用完释放
单次超大计算(如全基因组组装)⭐⭐⭐数据上传成本高,需评估
实时线上服务⭐Cromwell 不是为实时设计,别硬上

常见误区:我踩过的坑

我刚开始用 Cromwell 做混合云时,犯过不少低级错误。列几个典型的,你千万别再掉进去。

误区一:云端和本地用同一套 Docker 镜像,就能无缝切换?

不一定。不同的云厂商对 Docker 的支持细节不同。比如阿里云 BatchCompute 默认使用 OCI 兼容镜像,而 Google Cloud 的 Container Registry 需要额外配置认证。我曾经在本地跑得好好的工作流,上传到阿里云后报错 "pull access denied",折腾半天发现是镜像仓库权限没设对。

误区二:混合云就是简单的「本地+云端」两套 backend 配置

没那么简单。混合云需要解决「数据如何流动」的关键问题。本地数据怎么上传到云端?云端结果怎么下载回本地?Cromwell 本身不负责数据传输,你得自己搭一个共享文件系统(比如 NFS 挂载到云对象存储,或者用 rsync 同步)。我当时直接用 S3 作为中间存储,但没考虑到本地集群到 S3 的网络带宽瓶颈,结果跑大数据时卡在上传环节。

误区三:Cromwell 能自动处理所有失败重试

嗯,它能处理任务级别的重试,但遇上后端连接超时、云 API 限流这类问题,重试策略不够灵活。我曾经在阿里云 BatchCompute 上遇到过一个高频请求触发的限流错误,Cromwell 的默认重试间隔太短,一直失败。后来我不得不自己写脚本来调整重试间隔和退避策略。

核心知识图谱

下面这张图帮你理清 Cromwell 混合云执行的核心模块。我建议你收藏它,后面章节会反复参考。

Cromwell 混合云执行核心逻辑 Cromwell Server WDL / CWL 工作流 元数据/状态数据库 后端选择器 本地后端 SLURM / PBS / Local 云端后端 BatchCompute / AWS Batch 统一数据存储 箭头表示控制流,虚线表示数据流。混合云通过后端选择器动态调度任务到本地或云端。

我的个人建议:刚开始尝试混合云时,不要一上来就搞「动态溢出」。先把本地后端和云后端各自跑通,再手动切流量。稳定了再上自动调度。我当初就是因为心急,直接把 spill over 打开,结果任务来回飘,日志里全是乱序错误。