跳转至

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 failedWDL 语法错误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 年