在前面两部分,我们知道了如何撰写wdl流程,同时也对wdl执行每个任务的逻辑有了一个了解,接下来,我们来看看如何真实的投递一个wdl任务。
验证语法
没人喜欢投递任务下班回家,第二天上班发现由于脚本中的语法错误,它们在几分钟内都失败了。而针对NGS分析动辄几个小时的分析更是如此。所以我们在进行任务投递前,一定要先验证一下整体的语法逻辑。
而这部分工作可以通过 wdl自带的 WOMtools 实现。它提供了语法检查、参数检查、构造流程输入文件等功能。
为了验证语法,我们可以使用 validate 功能。1
java -jar wdltool.jar validate myWorkflow.wdl
wdltool 分析 WDL 脚本并提醒我们注意任何语法错误,例如缺少大括号、未定义的变量、缺少逗号等。它将解决导入问题,但请注意,它无法识别错误,例如命令中的拼写错误、不正确的文件名或缺少工作流中运行的程序所需的输入。
生成流程图
但语法验证没有问题时,我们肯定想更直观的看看我们的流程执行路径,一方面时帮助我们调试确定流程执行路径没有问题,另一方面也方便我们对外介绍我们的流程。 womtools 也支持这一个功能。1
2
3java -jar ../docker/womtool-46.jar graph workflow_test_pipe1.wdl >workflow_test_pipe1.wdl.dot
#转换为svg格式
dot -Tsvg -o workflow_test_pipe1.wdl.svg workflow_test_pipe1.wdl.dot
针对复杂的流程,生成graph可以非常方便的帮助我们理解流程的执行路径。
指定输入
在我们进行真实的流程分析的时候,往往需要进行一些参数的传入,比如样本的数据路径和属性信息等。
当然可以硬编码到流程中,但是每次更换数据都重写脚本,显然时非常不优雅也不可取的。而 wdl 提供的解决方案时每次运行的时候可以提供一个json文件,对流程中的变量进行定义,并在执行时,对json文件进行解析。
针对复杂流程梳理变量也是一个庞杂的工程,这里我们可以使用 WOMtools 来帮我们生成输入的json文件模板,然后用每次分析的实际值进行填空。
配置文件生成与填写
workflow 的输入,比如数据的存储位置、计算软件的命令行参数、计算节点的资源配置、镜像等等任务执行过程需要的参数,基本都可以通过 json 文件的形式来指定。使用 wdltools 工具可以根据 WDL 文件来生成输入模板:1
java -jar wdltools.jar inputs myWorkflow.wdl > myWorkflow_inputs.json
这样我们每次分析不同的数据就可以编辑模板文件,将实际的值填入其中。
模板格式如下:1
2
3{
"<workflow name>.<task name>.<variable name>":"<variable type>"
}
当然,如果工作流不是很复杂,也可以按照上面的格式手写 input 文件。下面是一个 GATK 工作流的 input 文件的片段:
执行任务
执行任务有许多不同的方式,这里我们暂时介绍最为常用的cromwell
Cromwell 是 Broad Institute 开发的工作流管理引擎。具有如下的优势:
- 支持 WDL 和 CWL 两种工作流描述语言
- 多平台支持,包括本地服务器、SGE集群、云计算平台等
- 阿里云批量计算是官方支持的云平台之一
- 丰富的元数据,展示工作流执行过程
- 支持多种高级特性,优化 workflow 的执行
本地运行
- run 模式
在本地机器上运行是最简单的事情。假设您有一个已验证的 WDL 脚本,称为 myWorkflow.wdl ,并且有一个名为 myWorkflow_inputs.json 的输入的 JSON 文件,您只需调用 Cromwell run 的函数,如下所示:1
java -jar Cromwell.jar run myWorkflow.wdl --inputs myWorkflow_inputs.json
运行完成后,Cromwell 会在当前目录生成一个 cromwell-executions 文件夹,里面包含了所有执行过程中产生的文件。
然后就可以看到 cromwell 每步的执行日志了。记住这都是 Cromwell 的日志,流程定义的屏幕输出都会保存到执行目录生成的 stderr 中
默认情况下,您可以在以下文件夹中找到所有生成的文件(输出和日志):1
2/Users/johnsmith/cromwell-executions/My-Workflows/\<run-id>/all-helloWorld
username workflow-name 随机hash task-name
这里是是最简单的投递方法,而cromwell本身支持非常多的个性化配置,从而使其可以适配SGE、云服务器、容器环境等等多种个性化场景,这部分我们后续在cromwell的配置中在展开进行介绍。
- Server 模式
1
2
3
4
5用下面的命令启动一个 HTTP server
java -Dconfig.file=application.conf -jar cromwell.jar server
再使用 RESTful API 提交工作流到 server 执行:
java -jar cromwell.jar submit -t wdl -i input.json -o option.json -h http://localhost:8000
相比 Run 模式,Server 模式有以下优势:
- 可以并行处理多个 workflow,适用于生产环境
- 有 Call caching 等高级特性(下文会讲到),优化 workflow 的执行
- 提供丰富的 workflow metadata,来展示 workflow 的执行过程
注意:不管是使用Run 模式还是 Server模式,要使用批量计算作为后端运行 WDL,都可以通过对应的配置文件支持,提供更多的附加支持,比如使用镜像分析,续跑等特性。配置文件详解请参考批量计算官方文档或Cromwell 官方文档。配置文件的整体说明和原理比较复杂,后面我们单独展开介绍
参考文档
在学习编写 WDL 的过程中,可以参考 Broad 官方的一些 GATK工作流 借鉴和学习 WDL 的用法。