Angelina
Angelina: 一款开源的,适用于生物信息学分析的任务调度系统,基于kubernetes,redis,glusterfs和golang构建。
一个简单作业的的例子如下:
1.一个作业分成了任务1,任务2,任务3,任务4
2.执行的顺序是: 任务1 --> 任务2,任务3 --> 任务4
3.任务2和任务3是并行执行
angelina主要就是解决上面的任务执行顺序。
主要特点:
1.每一个任务都是kubernetes中的一个deployment,只要做成相应的容器,无需重复部署任务所需的环境。
2.支持状态记录,每一个任务运行成功以后都会记录其状态,在整个作业运行过程中,如果有任务运行失败,下次启动该作业,直接从错误任务重新开始运行。
3.通过redis的订阅发布模式实现任务消息的接收与发送。
4.通过glusterfs实现任务之间文件共享。
5.可以把任务进一步拆成子任务。
6.对运行的任务进行监控,出现错误可重新调度任务。
依赖:
1.kubernetes (>= 1.8)
2.glusterfs (>= 3.8)
3.redis (>= 3.0)
4.go (>= 1.8)
安装
参考文档: angelina安装
angelina架构图:
(1)angelina架构图如下图所示:
(2)说明:
- 一个job有一个angelina controller与之对应,负责整个job的task调度,监控,错误恢复等操作。
- 一个job由很多个task组成,每一个task由一种runner与之对应,每一个runner是由一个deployment构成。
- 由angelina client去启动一个job。
- angelina client与angelina controller之间的通信以及angelina controller与angelina runner之间的通信是依靠redis的订阅发布模式。
- runner之间的文件共享通过glusterfs完成。
- task的运行状态存放在redis当中。
angelina命令行帮助信息
[root@683ea81c73f6 biofile]# go run angelina.go -h
Usage:
angelina [OPTIONS]
Application Options:
-v, --version software version.
// 打印版本信息
-f, --force force to run all step of the sample,ignore they are succeed or failed last time.
// 重新运行所有task,忽略上次运行的状态
-n, --name= Sample name.
// 指定job名称,这里把一个job也称为一个sample
-i, --input= Input directory,which includes some files that are important to run the sample.
// 指定运行该job所需要的文件的目录,应该把需要的文件放在一个目录下。
-o, --output= Output directory,which is a glusterfs mount point,so that copy files to glusterfs.
// glusterfs的入口目录,将在该目录下创建一个job名称的目录,与该job相关的task都在该目录下工作,input directory相关的文件也会复制到该目录下。
-t, --template= Pipeline template name,the sample will be running by the pipeline template.
// 指定template,angelina会按照这个template预先定义好的流程运行job.
-T, --tmp= A temporary pipeline template file,defines the running steps,the sample will be
running by it,can't be used with -t.
//指定一个临时template,不能和-t一起使用
-e, --env= Pass variable to the pipeline template such as TEST="test",this option can be
used many time,eg: -e TEST="test1" -e NAME="test".
// 指定该选项以后,该选项给定的环境变量会被应用到template中params域,覆盖其默认值。
-c, --config= configure file,which include the values of -f -n -i -o -t.
// 指定配置文件,把-f -n -i -o -t的信息写入到配置文件中,然后不用重复指定这些选项的值。
-r, --redis= Redis server address,can't use localhost:6379 and 127.0.0.1:6379,because they can't
be accessed by containers,give another address;if the -r option don't give,you must
set the System Environment Variable REDISADDR.
// 指定angelina所需要的redis server。不能指定127.0.0.1或者localhost,因为容器无法访问,如果不带该选项,那么必须设置REDISADDR系统环境变量,否则angelina无法运行。
Other Options:
-I, --init= Angelina configure file,the content of the file will be stored in the redis,and
use -g option will generate an angelina template configure file.
// 初始化angelina使用,后面跟上初始化文件,文件模板由 -g init 产生
-s, --store= Give a pipeline template file,and store it to redis.
// 生成一个新的template,并且保存
-l, --list List the pipelines which have already existed.
// 列出已经存在的template
-d, --delete= Delete the pipeline.
// 删除已经存在的template
-q, --query= give the pipeline id or pipeline name to get it's content.
// 查询template的详细信息
-g, --generate= Three value("conf","pipe","init") can be given,"pipe" is to generate a pipeline
template file and you can edit it and use -s to store the pipeline;"conf" is to
generate running configure file and you can edit it and use -c option to run the
sample;"init" is to generate angelina template configure file,then you can edit
it and use -I to init the angelina system.
// 产生相关的模板文件,-g init产生初始化模板文件,-g pipe产生template模板文件,-g conf产生运行job的配置文件(-c 选项使用), -g pipe,init,conf三个都产生。
Help Options:
-h, --help Show this help message
angelina模板文件书写
使用 angelina -g pipe 可以产生一个模板文件,只需要在此基础上填写相应的内容即可,模板如下:
{
"pipeline-name": "", // 模板名称
"pipeline-description": "", // 模板描述
"pipeline-content": {
"refer" : {
"": "",
"": ""
},
"input": ["",""],
"params": {
"": "",
"": ""
},
"step1": {
"pre-steps": ["",""],
"container": "",
"command-name": "",
"command": ["",""],
"args":["",""],
"sub-args": [""]
},
"step2": {
"pre-steps": ["",""],
"container": "",
"command-name": "",
"command": ["",""],
"args":["",""],
"sub-args": [""]
}
}
}
模板说明:
(1) pipeline-name: 模板名称
(2) pipeline-description: 模板描述
(3) pipeline-content: 模板内容
(4) pipeline-content: 主要分为四个域: refer,input,params,以及各个step,每个域都必须表示出来,如果没有数据就留空。
refer域的说明:
(1)主要在这设置一些任务所需的参考文件,比如参考基因组文件等,下面是个例子:
"refer" : {
"fasta": "reffa/b37/hg19.fasta",
"dbsnp138": "refvcf/b37/dbsnp138.vcf"
}
(2)这个域所涉及的文件都是只读属性,也就是说你不可以在运行job当中去修改这些文件。
(3)这个域中的文件路径是一个相对路径,主要是相对于之前我们配置的refer-volume,也就是说,假如我的refer-volume下面放了如下目录:
[root@683ea81c73f6 refer]# ll
total 17045972
drwxr-xr-x 3 root root 4096 May 5 2017 annovar_db
drwxr-xr-x 3 root root 4096 May 5 2017 reffa
drwxr-xr-x 3 root root 4096 May 5 2017 refvcf
-rw-r--r-- 1 root root 17455058559 Apr 25 02:39 test.tar.gz
drwxr-xr-x 2 root root 4096 Apr 7 11:19 yang
如果我需要reffa/b37/hg19.fasta那么我只需要写reffa/b37/hg19.fasta就行,切记路径要写对,否则运行任务失败。
(4)如果要在后续的step当中引用该域的一些文件,比如我需要hg19.fasta文件,只需要在step当中写成 “refer@fasta”
就行。
(5)如果该域没有内容,那么写成如下格式:
"refer": {}
input域说明:
(1) input域主要是对输入文件名称进行转换的,如果不转换,默认是原名复制,下面是一个例子:
"input": [
"*_R1.fastq.gz ==> test1_R1.fastq",
"*_R2.fastq.gz ==> test1_R2.fastq",
"a.txt ==> b.txt"
]
(2)上面的例子表达的意思是: a.将input目录当中带有“_R1.fastq.gz”后缀的文件,复制到glusterfs中,并且解压缩成test1_R1.fastq(目前只支持gzip的解压缩);b.将input目录当中带有“_R2.fastq.gz”后缀的文件,复制到glusterfs中,并且解压缩成test1_R2.fastq;c.将input目录当中的a.txt复制到glusterfs,并且重命名为b.txt
(3) 该域中input目录下每一个匹配到的文件最多只能一个,例如“*_R1.fastq.gz ==> test1_R1.fastq”中,匹配到“*_R1.fastq.gz”的文件至多只有一个,假设在input目录当中有“test_R1.fastq.gz”和“test1_R1.fastq.gz”,将会报错,因为不知道将哪一个文件转化为"test1_R1.fastq"。
(4)从input目录下复制的所有文件,将会存放在: glusterfs:data-volume/jobName/step0下 (data-volume是之前我们创建的job数据存放目录,jobName是每一个job的名称)
params域的说明:
(1)params域主要是对step当中的命令的参数进行配置,与直接在step配置参数不同的是,该域的值可以在运行job时动态传入,下面是一个例子:
"params": {
"FASTQC": "2",
"TRIM": "/root/Trimmomatic-0.36/trimmomatic-0.36.jar",
"TRIMDIR":"/root/Trimmomatic-0.36"
},
比如上面的例子的当中,可以在命令行通过“-e FASTQC=5”动态修改这个值。
(2)在step当中引用params里面的值,比如在step当中需要使用“/root/Trimmomatic-0.36” 这个值,可以在step中使用“params@TRIMDIR”替换。
step域说明:
(1) step域是由众多的step组成,并且step编号必须从step1开始,连续不间断,不能重复定义,也就是说不能同时出现多个同样的step编号,下面是一个step例子:
"step1": {
"pre-steps": [],
"command-name":"fastqc",
"container": "registry.vega.com:5000/fastqc:1.0",
"command": ["fastqc"],
"args":["-o step1@","-f fastq","step0@test1_R1.fastq step0@test1_R2.fastq"],
"sub-args": []
}
pre-steps: 该step所依赖的step,有多少写多少,没有就写成[].
command-name: 为该step运行的命令取一个别名。不能留空
container: 运行该step所需要的容器
command: 该step所需要运行的命令,数组内容会拼接成字符串。
args: 命令所需的参数,数组内容会拼接成字符串。
sub-args: 数组类型,数组的长度代表在该step需要启动多少个这样的容器,来处理不同输入不同输出。
(2) 下面是一个启动多个相同step的例子:
"step2": {
"pre-steps": ["step1"],
"command-name":"test",
"container": "registry.vega.com:5000/test:1.0",
"command": ["/bin/bash","/root/test.sh"],
"args":["name","30"],
"sub-args": ["a.out","b.out"]
}
angelina会启动两个registry.vega.com:5000/test:1.0 类型的容器来运行step2,第一个容器运行的命令是:“/bin/bash /root/test.sh name 30 a.out”,第二个容器运行的命令是“/bin/bash /root/test.sh name 30 b.out”
启动容器的数量有sub-args数组长度确定。
(3)如果该step只需要运行一个命令,那么只需要将sub-args留空就行。
(4)如果在该step当中需要引用pre-steps当中的一些文件,可以使用pre-step的名称+“@”来实现,例如下面:
"step2": {
"pre-steps": ["step1"],
"command-name":"test",
"container": "registry.vega.com:5000/test:1.0",
"command": ["/bin/bash","/root/test.sh"],
"args":["name","30","step1@my.txt","refer@fasta","paramas@TRIMDIR"],
"sub-args": ["a.out","b.out"]
}
step2用到了step1的my.txt,只需要使用step1@my.txt就行。
(5) 在step当中用到的所有文件都是使用相对路径。
(6) step0只能被引用,不能被定义。
一个简单的模板例子
{
"refer" : {
"fasta": "reffa/b37/human_g1k_v37_decoy.fasta"
},
"input": ["*_R1.fastq.gz ==> test1_R1.fastq","*_R2.fastq.gz ==> test1_R2.fastq"],
"params": {
"FASTQC": "2",
"TRIM": "/root/Trimmomatic-0.36/trimmomatic-0.36.jar",
"TRIMDIR":"/root/Trimmomatic-0.36"
},
"step1": {
"pre-steps": [],
"command-name":"fastqc",
"container": "registry.vega.com:5000/fastqc:1.0",
"command": ["fastqc"],
"args":["-t params@FASTQC","-o step1@","-f fastq","step0@test1_R1.fastq step0@test1_R2.fastq"],
"sub-args": []
},
"step2": {
"pre-steps": [],
"command-name": "trimmomatic-0.36.jar",
"container": "registry.vega.com:5000/trim:1.0",
"command": ["java","-jar","params@TRIM"],
"args":["PE -phred33","-threads 2","step0@test1_R1.fastq step0@test1_R2.fastq step2@test1_R1_paired.fastq step2@test1_R1_unpaired.fastq step2@test1_R2_paired.fastq step2@test1_R2_unpaired.fastq","LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:75","ILLUMINACLIP:params@TRIMDIR/adapters/TruSeq3-PE-2.fa:2:30:10"],
"sub-args": []
},
"step3": {
"pre-steps":["step2"],
"command-name":"bwa mem",
"container": "registry.vega.com:5000/bwa:1.0",
"command": ["bwa","mem"],
"args":["-t 1","-M","-R '@RG\\tID:ST_Test_Yang_329_H7NNYALXX_6\\tSM:ST_Test_Liuhong\\tLB:WBJPE171539-01\\tPU:H7NNYALXX_6\\tPL:illumina\\tCN:thorgene'","refer@fasta"],
"sub-args":["step2@test1_R1_paired.fastq step2@test1_R2_paired.fastq > step3@test1.sam","step2@test1_R1_paired.fastq step2@test1_R2_paired.fastq > step3@test2.sam"]
}
}
模板会转化成如下模板(这个例子中job名为mahui,data-volume会被挂载到容器的/mnt/data,refer-volume会被挂载到容器的/mnt/refer):
{
"step1":{
"Command":"fastqc -t 2 "
"CommandName":"fastqc",
"Args":"-t 2 -o /mnt/data/mahui/step1/ -f fastq /mnt/data/mahui/step0/test1_R1.fastq /mnt/data/mahui/step0/test1_R2.fastq ",
"Container":"registry.vega.com:5000/fastqc:1.0",
"Prestep":[],
"SubArgs":[]
},
"step2":{
"Command":"java -jar /root/Trimmomatic-0.36/trimmomatic-0.36.jar ",
"CommandName":"trimmomatic-0.36.jar",
"Args":"PE -phred33 -threads 2 /mnt/data/mahui/step0/test1_R1.fastq /mnt/data/mahui/step0/test1_R2.fastq /mnt/data/mahui/step2/test1_R1_paired.fastq /mnt/data/mahui/step2/test1_R1_unpaired.fastq /mnt/data/mahui/step2/test1_R2_paired.fastq /mnt/data/mahui/step2/test1_R2_unpaired.fastq LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:75 ILLUMINACLIP:/root/Trimmomatic-0.36/adapters/TruSeq3-PE-2.fa:2:30:10",
"Container":"registry.vega.com:5000/trim:1.0",
"Prestep":[],
"SubArgs":[]
},
"step3":{
"Command":"bwa mem",
"CommandName":"bwa mem",
"Args":"-t 1 -M -R '@RG\\tID:ST_Test_Yang_329_H7NNYALXX_6\\tSM:ST_Test_Liuhong\\tLB:WBJPE171539-01\\tPU:H7NNYALXX_6\\tPL:illumina\\tCN:thorgene' /mnt/refer/reffa/b37/human_g1k_v37_decoy.fasta ",
"Container":"registry.vega.com:5000/bwa:1.0",
"Prestep":["step2"],
"SubArgs":[" /mnt/data/mahui/step2/test1_R1_paired.fastq /mnt/data/mahui/step2/test1_R2_paired.fastq > /mnt/data/mahui/step3/test1.sam "," /mnt/data/mahui/step2/test1_R1_paired.fastq /mnt/data/mahui/step2/test1_R2_paired.fastq > /mnt/data/mahui/step3/test2.sam "]
}
}