WDL - 投递我们的流程

在前面两部分,我们知道了如何撰写wdl流程,同时也对wdl执行每个任务的逻辑有了一个了解,接下来,我们来看看如何真实的投递一个wdl任务。

验证语法

没人喜欢投递任务下班回家,第二天上班发现由于脚本中的语法错误,它们在几分钟内都失败了。而针对NGS分析动辄几个小时的分析更是如此。所以我们在进行任务投递前,一定要先验证一下整体的语法逻辑。
而这部分工作可以通过 wdl自带的 WOMtools 实现。它提供了语法检查、参数检查、构造流程输入文件等功能。
为了验证语法,我们可以使用 validate 功能。

1
$ java -jar wdltool.jar validate myWorkflow.wdl

wdltool 分析 WDL 脚本并提醒我们注意任何语法错误,例如缺少大括号、未定义的变量、缺少逗号等。它将解决导入问题,但请注意,它无法识别错误,例如命令中的拼写错误、不正确的文件名或缺少工作流中运行的程序所需的输入。

生成流程图

但语法验证没有问题时,我们肯定想更直观的看看我们的流程执行路径,一方面时帮助我们调试确定流程执行路径没有问题,另一方面也方便我们对外介绍我们的流程。 womtools 也支持这一个功能。

1
2
3
java -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可以非常方便的帮助我们理解流程的执行路径。
image

指定输入

在我们进行真实的流程分析的时候,往往需要进行一些参数的传入,比如样本的数据路径和属性信息等。
当然可以硬编码到流程中,但是每次更换数据都重写脚本,显然时非常不优雅也不可取的。而 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 文件的片段:
image

执行任务

执行任务有许多不同的方式,这里我们暂时介绍最为常用的cromwell
image

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 WDL 官方论坛

WDL项目仓库

OpenWDL

WDL-readthedoc

标准流程描述语言 WDL 阿里云最佳实践

在学习编写 WDL 的过程中,可以参考 Broad 官方的一些 GATK工作流 借鉴和学习 WDL 的用法。

-------------本文结束感谢您的阅读-------------