如何简单调试WDL脚本
biocli命令行需要编写pipeline和job文件来托管任务,在WDL脚本编写阶段调试人员需要频繁修改Pipeline。为此Achelous 提供了一个简单的命令行wdl,可以直接运行wdl脚本提交任务到调度系统进行分布式运行,方便脚本的编写和调试。
1. WDL命令行介绍及配置
Achelous 用户可以通过下载页面中,获取对应版本集群 WDL测试引擎安装包。
[!WARNING|style:flat] 集群版 wdl命令行功能只对Achelous 用户集群有效,如非Achelous 用户,请采用单机版wdl 进行测试。
安装后可查看wdl
命令参数。
[demo@Cc3Apc wdl-interactive]$ wdl run -h
usage: wdl run [<flags>] <wdlfile> <datafile>
Run the WDL file on the input data
Flags:
-h, --help Show context-sensitive help (also try --help-long and --help-man).
-t, --trace Trace the execution of Wom Graph
-c, --concurrent Concurrent execution the Wom Graph
-w, --workdir=WORKDIR The work directory of the WDL program, default: /opt/workflow
-m, --mode=MODE execution mode of wdl task: docker | paladin
-r, --resources=RESOURCES Resources avaliable to the docker container, such as CPU, etc
-q, --queue=QUEUE The schedule domain used by the job
-p, --priority="0" The priority of the job
Args:
<wdlfile> The file of the WDL program
<datafile> The input data file of the WDL program
wdl命令行执行前需要简单的配置,在用户的home目录下,编辑文件.wdlconfig如下: 令解决:
{
"volumes" : [
"/home"
]
}
一般用户只需要在文件中配置volumes
挂载路径,即默认每个容器需要挂载的卷目录。由于wdl命令行没有bioflow自动卷挂载功能,所有的卷可以在~/.wdlconfig中指定,或者在task中通过volumes属性指定。可以不指定volumes,但是需要创建~/.wdlconfig,编写一个空{}
。
2 示例
以下为使用wdl
命令进行投递的命令行示例:
(base) [demo@Cc3Saturn wdl-interactive]$ wdl run -w ./work -m paladin src/demo-pipeline.wdl input.json
Start execution remotely in Paladin
The resources configuration is: Resources(Cpu:-1.000000,Memory:-1.000000,Volumes:/home,NotifyServer:,PaladinServer:paladin-backend.servicemgr.saturn:1026)
Workflow Outputs:
output_bam: /home/demo/wdl-interactive/work/wxs-wxs.markdup/P59_N.dup.bam
gvcf: /home/demo/wdl-interactive/work/wxs-wxs.HaplotypeCaller/P59_N.g.vcf.gz
Time cost: 4m17.274331754s
其中:
- -w 指定工作目录,必须是一个共享存储的目录
- -m paladin指定投递作业到Paladin(也就是在集群中运行任务)。-m不指定的话会在本地执行,不建议这样。
- -p 可以指定作业的优先级0~10
- -q 可以指定作业的队列后者调度域
在工作目录下生成一个wdl-engine.log
,该文件记录作业的执行过程。
示例中的input.json
是一个JSON格式的文件,对应着作业的主workflow的输入参数赋值,如下所示:
{
"wxs.read1": "/home/demo/makeflow-demo/demo1.fq.gz",
"wxs.read2": "/home/demo/makeflow-demo/demo2.fq.gz",
"wxs.prefix" : "P59_N",
"wxs.ref" : "/home/demo/makeflow-demo/chr22.fa"
}
其内容对应job的JSON中的WorkflowInput指向的部分:
{
"Name" : "demo-job",
"Pipeline" : "GATK4-PART-PIPELINE",
"InputDataSet" : {
"WorkflowInput" : {
"wxs.read1": "/home/demo/makeflow-demo/demo1.fq.gz",
"wxs.read2": "/home/demo/makeflow-demo/demo2.fq.gz",
"wxs.prefix" : "P59_N",
"wxs.ref" : "/home/demo/makeflow-demo/chr22.fa"
}
},
"Priority" : 7,
"ScheduleDomains" : "all"
}
3 如何查看提交到Paladin的任务
wdl
命令行产生的正在运行的任务,可以通过hermit qstat -r
查看:
(base) demo@Cc1Saturn:~$
(base) demo@Cc1Saturn:~$ hermit qstat -r
job-ID prior name user state submit/start at queue slots ja-task-ID
----------------------------------------------------------------------------------------------------------------------------------------------------------
paladin-task.10704ae6-b4cd-4fe9-973c-b77a10a16679 0 demo.wdlcmd.wxs-wxs.bwa_mem demo running 28 second(s) ago -NA- -NA- -NA-
从上述结果可以看到,wdl
命令行产生的task的name有明显的模式:USERID.wdlcmd.WDL-STAGE-NAME
通过Poros界面也可以看到任务列表,寻找task的name得模式:
[!NOTE|style:flat]
- wdl命令行仅仅支持简单的脚本调试,生产请用biocli。
- wdl支持一定程度的作业恢复。即ctrl-c后,再次运行,会从上一个任务开始执行。不保证生产级别的可用性。
- 不支持高级功能:Spark、AI、自动卷挂载等等