WDL语言基本概念
两级结构:workflow, task
runtime:镜像,memory等
output可以没有,如重命名等操作。
A、B无顺序要求
WDL脚本基本结构
task
1. 输入
文件、数值、字符串等信息
task fastq_to_bam{
File fastq
File ref
command{
bwa mem ${ref} ${fastq} > my_temp.sam
samtools view -B my_temp.sam > my_temp.bam
rm my_temp.sam
}
}
2. 命令行command
类似于linux shell,支持多行。如上
更多复杂的命令,条件循环等,支持管道(但不建议,若某步出错,正常退出)。
3. 输出output
规定输出结果,并为后续操作提供可以引用的信息;
需要规定输出的类型;
支持WDL自定义函数的引用。
执行顺序:按上一步output——>下一步input
若上一步task1没有输出,如何保证task2等顺序?
需要在task1中定义一个output,再在后面task定义为input。
4. 运行参数 runtime
记录运行中使用的资源信息,包括docker、CPU、GPU、memory等信息
当输入文件相对复杂时,如何限定资源?
5. meta信息
记录辅助信息,如作者、联系方式等
workflow
提交作业的基本单位。
其结构是对task的组织(call task)
虽然是按顺序结构书写,但调度器对WDL解析时,会按照并行方式解析。
import "src/call_cnv.wdl" as cnv_tools
workflow demo{
File myfile1
File myfile2 ...
call task1{input:...}
call task2{input:...}
if(...){...}
scatter(...){...}
output{
File output1 = output_dir1
File output2 = output_dir2
}
}
WDL结构与Shell不同,其书写前后关系并不代表执行的前后关系。执行顺序是由task之间的依赖关系来确定的。
WDL控制语句
if 控制语句
与一般语言区别不大,但语法更严格,其判断部分必须为Bool类型,不能为字符串等类型,如if(T)。
scatter 并发语句
与一般语言的for/while不同,可同时执行多条相同形式的命令,从而减少计算时间,增加硬件设备的利用率。
小结
-
WDL执行顺序和一般语言有明显区别;
-
基本语法(task、workflow的基本结构);
-
代码除了给解析器看,也要给人看。
https://www.bilibili.com/video/BV1mr4y1S7YL/?spm_id_from=333.788.recommend_more_video.-1