第3章 安装Cromwell:下载与配置运行环境
好了,到了真刀真枪动手的时候。这一章我们就搞定Cromwell的安装和基础配置。别担心,这东西不像某些生物信息学工具那么折腾,几步就能跑起来。
我个人习惯把Cromwell装在专用的服务器或者开发机上,Windows下也可以跑,但生产环境还是建议Linux。嗯,这里假设你用的是Ubuntu 20.04+或者CentOS 7+。
3.1 下载 Cromwell JAR 包
Cromwell本身就是一个可执行的JAR文件。你想想看,人家设计得挺清爽的——没有复杂的依赖安装,拿下来就能用。
去GitHub Releases页面找最新版。我写这个课程时稳定版是85,你可以替换成你需要的版本。
# 创建一个专用目录
mkdir -p ~/cromwell
cd ~/cromwell
# 下载 Cromwell JAR(替换版本号为你需要的)
wget https://github.com/broadinstitute/cromwell/releases/download/85/cromwell-85.jar
# 同时下载 womtool(可选,但很有用)
wget https://github.com/broadinstitute/cromwell/releases/download/85/womtool-85.jar
# 验证文件完整性
ls -lh *.jar
小技巧:我用了个别名来简化启动命令。在 ~/.bashrc 里加一行:
alias cromwell='java -jar ~/cromwell/cromwell-85.jar'
之后直接敲 cromwell run ... 就行,省得每次打全路径。
3.2 安装 Java 运行环境
Cromwell 是基于 JVM 的,所以必须先装 Java。我建议用 Java 11 或 Java 17,别用 Java 8 了——我在项目中踩过坑,Java 8 下某些 WDL 特性会报奇怪错误。
# Ubuntu / Debian
sudo apt update
sudo apt install -y openjdk-11-jre
# CentOS / RHEL
sudo yum install -y java-11-openjdk
# 验证
java -version
注意:千万不要装 headless 版本的 JRE,有些 GUI 依赖在 Cromwell 的 Web 服务模式下会遇到问题。就装标准 JRE。
3.3 快速验证:运行 Hello World
Cromwell 装没装好,跑个最简单的 WDL 脚本就知道了。我每次装新环境都会用这个测试。
创建一个 hello.wdl:
version 1.0
workflow hello_workflow {
call hello
}
task hello {
command {
echo "Hello, Cromwell!"
}
output {
String greeting = read_string(stdout())
}
}
再创建一个 hello_inputs.json(虽然这个例子不需要输入,但 Cromwell 习惯要一个):
{}
然后运行:
java -jar ~/cromwell/cromwell-85.jar run hello.wdl -i hello_inputs.json
如果看到类似下面的输出,说明安装成功了:
...
[info] SingleWorkflowRunnerActor Workflow completion status: Succeeded
{
"hello_workflow.hello.greeting": "Hello, Cromwell!"
}
关键点:输出结果是一个 JSON,里边包含了所有任务的输出。我刚开始用的时候老去翻 log,后来发现直接看这个 JSON 就清楚了。
3.4 配置 Cromwell 运行模式
Cromwell 有两种运行方式:
| 模式 | 适用场景 | 命令示例 |
|---|---|---|
| 单次运行 (Run) | 本地测试、小流程 | java -jar cromwell.jar run workflow.wdl |
| 服务器模式 (Server) | 生产环境、并发任务、REST API 调用 | java -jar cromwell.jar server |
我建议初学者先用单次运行摸清流程。等你需要管理多个工作流时,再切到服务器模式。
3.5 服务器模式配置详解
服务器模式需要一个配置文件 cromwell.conf。这货用的是 HOCON 格式,说白了就是带缩进的 JSON,更人性化一点。
下面是一个最小可用的配置:
include required("application.conf")
webservice {
port = 8000
interface = "0.0.0.0"
}
call-caching {
enabled = true
invalidate-bad-cache-results = true
}
database {
profile = "slick.jdbc.HsqldbProfile$"
db {
driver = "org.hsqldb.jdbcDriver"
url = "jdbc:hsqldb:file:./cromwell-executions/cromwell-db;shutdown=false"
connectionTimeout = 30000
numConnections = 5
}
}
然后启动:
java -jar ~/cromwell/cromwell-85.jar server --config cromwell.conf
启动后访问 http://localhost:8000 就能看到 Cromwell 的 Web 界面了。
避坑:默认使用 HSQLDB 作为数据库,但这是内存/文件型数据库,生产环境别这么干。我曾经在一个项目中用 HSQLDB 跑了一周,结果服务器断电,数据库文件损坏,所有运行记录全丢了。后来我切到了 MySQL。
生产环境请配置 MySQL 或 PostgreSQL,配置示例后面章节会讲。
3.6 环境变量与 PATH 配置(可选)
为了方便,我习惯把 Cromwell 加到 PATH 里。创建一个启动脚本 ~/bin/cromwell-run:
#!/bin/bash
JAVA_OPTS="-Xmx4g -Xms1g"
exec java $JAVA_OPTS -jar ~/cromwell/cromwell-85.jar "$@"
然后:
chmod +x ~/bin/cromwell-run
export PATH="$HOME/bin:$PATH"
之后直接 cromwell-run run workflow.wdl 就行了。嗯,这样省心。
3.7 验证服务器模式
启动服务器后,用 curl 测试一下 API 是否正常:
# 查询版本
curl http://localhost:8000/api/v1/version
# 查询后端状态
curl http://localhost:8000/api/v1/backends
# 提交一个工作流(假设有 workflow.wdl 和 inputs.json)
curl -X POST \
http://localhost:8000/api/v1/workflows/v1 \
-F workflowSource=@workflow.wdl \
-F workflowInputs=@inputs.json
返回的 JSON 里会有 id 字段,那是你的工作流唯一标识。后面查状态、取消任务都用这个 ID。
这张图把整个安装决策路径串起来了。你下载 JAR → 装 Java → 验证 → 根据场景选模式。我个人推荐先在单次运行模式下摸熟 WDL 语法,然后再搭服务器。
我的实战建议:如果你只是临时跑几个流程,单次模式就够了,不用开数据库。但一旦涉及多个流程并行、需要缓存中间结果、或者要给别人提供 API 访问,立刻上服务器模式+MySQL。我见过有人用单次模式跑了50个流程,结果中间断网一次,全部重跑——浪费了三天计算时间。
3.8 常见问题排错
安装过程中你可能会遇到下面这些问题,我把经验列出来:
| 现象 | 原因 | 解决方法 |
|---|---|---|
NoClassDefFoundError |
Java 版本不匹配 | 换用 Java 11 或 17,运行 java -version 确认 |
报错 Could not find or load main class |
JAR 文件损坏或路径错误 | 重新下载,检查 md5 校验和 |
| 服务器启动后 Web UI 打不开 | 端口被占用或防火墙拦截 | lsof -i:8000 查端口,修改配置文件中的端口号 |
| HSQLDB 文件报错 | 数据库文件锁冲突或损坏 | 删除 cromwell-db.* 文件重新启动(测试环境) |
重要提醒:每次升级 Cromwell 版本时,先备份数据库!不同版本之间的元数据 schema 可能有变化。我之前从 84 升到 85 时,HSQLDB 的文件格式不兼容,花了半天才导出来。后来我换成了 MySQL,升级就简单多了。