WDL/Cromwell 工作流
一句话概述:WDL(Workflow Description Language)是 Broad Institute 开发的工作流语言,Cromwell 是它的执行引擎,GATK 最佳实践流程就用 WDL 写的,是基因组分析的标准方案。
核心知识点
| 概念 | 白话解释 |
|---|
| WDL | 工作流描述语言 = 用来写分析流程的语言 |
| Cromwell | 执行引擎 = 负责跑 WDL 流程的程序 |
| Task | 任务 = 一个独立的计算步骤 |
| Workflow | 工作流 = 多个 Task 的组合 |
| Call | 调用 = 在工作流中运行一个 Task |
| Scatter | 分散 = 并行处理多个样本(类似 for 循环) |
安装配置
# 安装 Cromwell(需要 Java 11+)
wget https://github.com/broadinstitute/cromwell/releases/download/87/cromwell-87.jar
wget https://github.com/broadinstitute/cromwell/releases/download/87/womtool-87.jar
# 验证
java -jar cromwell-87.jar --version # Cromwell 版本
java -jar womtool-87.jar --version # WOMtool(验证工具)
# 安装 miniwdl(轻量替代)
pip install miniwdl # Python 实现的 WDL 执行器
基本使用
# fastqc.wdl — 简单的 FastQC 任务
version 1.0
task fastqc {
input {
File fastq_file # 输入:FASTQ 文件
Int threads = 2 # 线程数(默认2)
}
command <<<
fastqc -t ~{threads} ~{fastq_file} # 运行 FastQC
>>>
output {
File html_report = glob("*.html")[0] # 输出:HTML 报告
File zip_data = glob("*.zip")[0] # 输出:ZIP 数据
}
runtime {
docker: "biocontainers/fastqc:v0.12.1" # Docker 容器
cpu: threads # CPU
memory: "4 GB" # 内存
}
}
workflow run_fastqc {
input {
Array[File] fastq_files # 输入:多个 FASTQ
}
scatter (fq in fastq_files) { # 并行处理每个文件
call fastqc { input: fastq_file = fq }
}
output {
Array[File] reports = fastqc.html_report # 收集所有报告
}
}
// inputs.json — 输入参数
{
"run_fastqc.fastq_files": [
"/data/sample1_R1.fastq.gz",
"/data/sample1_R2.fastq.gz",
"/data/sample2_R1.fastq.gz"
]
}
# 验证 WDL 语法
java -jar womtool-87.jar validate fastqc.wdl # 语法检查
# 运行流程
java -jar cromwell-87.jar run fastqc.wdl \
-i inputs.json # Cromwell 运行
# 用 miniwdl 运行(更简单)
miniwdl run fastqc.wdl \
fastq_files=/data/sample1_R1.fastq.gz # miniwdl 运行
高级用法
GATK 变异检测流程
version 1.0
task bwa_mem {
input {
File ref_fasta
File ref_index
File fastq_r1
File fastq_r2
String sample_name
}
command <<<
bwa mem -t 8 ~{ref_fasta} ~{fastq_r1} ~{fastq_r2} | \
samtools sort -@ 4 -o ~{sample_name}.sorted.bam
samtools index ~{sample_name}.sorted.bam
>>>
output {
File sorted_bam = "~{sample_name}.sorted.bam"
File sorted_bai = "~{sample_name}.sorted.bam.bai"
}
runtime {
docker: "broadinstitute/gatk:latest"
cpu: 8
memory: "16 GB"
}
}
workflow variant_calling {
input {
Array[String] sample_names
Array[File] r1_files
Array[File] r2_files
File ref_fasta
File ref_index
}
scatter (i in range(length(sample_names))) {
call bwa_mem {
input:
ref_fasta = ref_fasta,
ref_index = ref_index,
fastq_r1 = r1_files[i],
fastq_r2 = r2_files[i],
sample_name = sample_names[i]
}
}
}
常见报错
| 报错信息 | 原因 | 解决方法 |
|---|
Workflow validation failed | WDL 语法错误 | 用 womtool validate 检查 |
Docker image not found | 容器镜像不存在 | 先 docker pull |
Insufficient disk | 磁盘空间不足 | 增加 disks runtime 配置 |
Call failed | 命令执行失败 | 查看 stderr 文件 |
速查表
# === WDL 执行 ===
java -jar womtool.jar validate file.wdl # 验证语法
java -jar cromwell.jar run file.wdl -i inputs.json # 运行
miniwdl run file.wdl key=value # miniwdl 运行
# === WDL 语法要点 ===
# version 1.0 — 版本声明(必须)
# task { } — 定义任务
# workflow { } — 定义工作流
# scatter (x in arr) — 并行处理
# if (condition) — 条件执行
# call task_name — 调用任务
# === Nextflow vs WDL ===
# WDL: Broad/GATK 生态、语法更严格、类型安全
# Nextflow: 社区更大(nf-core)、DSL 更灵活、HPC 支持更好
参考:WDL 规范 | Cromwell | 更新于 2026 年